作者热门文章
- mongodb - 在 MongoDB mapreduce 中,如何展平值对象?
- javascript - 对象传播与 Object.assign
- html - 输入类型 ="submit"Vs 按钮标签它们可以互换吗?
- sql - 使用 MongoDB 而不是 MS SQL Server 的优缺点
请用代码示例说明为什么 SimpleDateFormat 不是线程安全的。这个类有什么问题?SimpleDateFormat的格式化功能有问题?请给出在类里面演示此故障的代码。
FastDateFormat 是线程安全的。为什么?SimpleDateFormat 和 FastDateFormat 有什么区别?
请用演示此问题的代码解释一下?
最佳答案
SimpleDateFormat
将中间结果存储在实例字段中。因此,如果一个实例被两个线程使用,它们可能会混淆彼此的结果。
看source code显示有一个 Calendar
实例字段,用于 DateFormat
/SimpleDateFormat
上的操作。
例如 parse(..)
首先调用 calendar.clear()
,然后调用 calendar.add(..)
。如果另一个线程在第一次调用完成之前调用 parse(..)
,它将清除日历,但另一个调用将期望它填充计算的中间结果。
在不交易线程安全的情况下重用日期格式的一种方法是将它们放在 ThreadLocal
中 - 一些库会这样做。那就是如果您需要在一个线程中多次使用相同的格式。但如果您使用的是 servlet 容器(具有线程池),请记住在完成后清理线程本地。
说实话,我不明白他们为什么需要实例字段,但事实就是如此。您也可以使用joda-time DateTimeFormat
是线程安全的。
关于java - 为什么 Java 的 SimpleDateFormat 不是线程安全的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6840803/
我是一名优秀的程序员,十分优秀!