为什么Java的SimpleDateFormat不是线程安全的?

2022-08-31 05:28:03

请用一个代码示例来说明为什么 SimpleDateFormat 不是线程安全的。这门课有什么问题?SimpleDateFormat的格式功能有问题吗?请给出一个代码,在类中演示此错误。

FastDateFormat是线程安全的。为什么?SimpleDateFormat和FastDateFormat的b/w有什么区别?

请用代码来解释这个问题?


答案 1

SimpleDateFormat在实例字段中存储中间结果。因此,如果两个线程使用一个实例,它们可能会弄乱彼此的结果。

查看源代码显示有一个实例字段,该字段由 / 上的操作使用。CalendarDateFormatSimpleDateFormat

例如,最初调用,然后调用 。如果另一个线程在第一个调用完成之前调用,它将清除日历,但另一个调用将期望用计算的中间结果填充它。parse(..)calendar.clear()calendar.add(..)parse(..)

在没有交易线程安全性的情况下重用日期格式的一种方法是将它们放在一个 - 一些库这样做。也就是说,如果您需要在一个线程中多次使用相同的格式。但是,如果您使用的是 servlet 容器(具有线程池),请记住在完成后清理线程本地。ThreadLocal

说实话,我不明白他们为什么需要实例字段,但事实就是这样。您还可以使用joda-time,这是线程安全的。DateTimeFormat


答案 2

SimpleDateFormat 是一个具体类,用于以区分区域设置的方式格式化和分析日期。

JavaDoc

但日期格式不同步。建议为每个线程创建单独的格式实例。如果多个线程同时访问一种格式,则 .it must be synchronized externally

若要使 SimpleDateFormat 类成为线程安全的,请查看以下方法

  • 每次需要使用一个新的 SimpleDateFormat 实例时,都会创建一个实例。尽管这是线程安全的,但它是最慢的方法。
  • 使用同步。这是一个坏主意,因为您永远不应该将线程阻塞在服务器上。
  • 使用 ThreadLocal。这是3种方法中最快的方法(见 http://www.javacodegeeks.com/2010/07/java-best-practices-dateformat-in.html)。

推荐