请用代码示例说明为什么 SimpleDateFormat 不是线程安全的。这堂课有什么问题?是SimpleDateFormat的格式化函数的问题?
请给出在课堂上演示此错误的代码。
FastDateFormat 是线程安全的。为什么?
SimpleDateFormat 和 FastDateFormat 有什么区别?
请用代码解释一下这个问题?
SimpleDateFormat
将中间结果存储在实例字段中。因此,如果一个实例被两个线程使用,它们可能会弄乱彼此的结果。
看着源代码 http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/6-b14/java/text/DateFormat.java/?v=source揭示了有一个Calendar
实例字段,由以下操作使用DateFormat
/ SimpleDateFormat
.
例如parse(..)
calls calendar.clear()
最初然后calendar.add(..)
。如果另一个线程调用parse(..)
在第一次调用完成之前,它将清除日历,但其他调用将期望它填充计算的中间结果。
在不牺牲线程安全性的情况下重用日期格式的一种方法是将它们放在ThreadLocal
- 有些图书馆这样做。也就是说,如果您需要在一个线程内多次使用相同的格式。但如果您使用的是 servlet 容器(具有线程池),请记住在完成后清理线程本地。
老实说,我不明白他们为什么需要实例字段,但事实就是这样。您还可以使用乔达时间 http://joda-time.sourceforge.net/ DateTimeFormat
这是线程安全的。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)