我们可以将SimpleDateFormat对象声明为静态对象

时间:2011-05-26 11:09:07

标签: java thread-safety simpledateformat

SimpleDateFormat monthFormat = new SimpleDateFormat("MMMM");
SimpleDateFormat fullFormat = new SimpleDateFormat("EE MMM dd, HH:mm:ss")

我有几个这样的代码经常被调用,将它们声明为static变量是否有意义?

在这种情况下,将动态参数传递给format()方法是否安全?

5 个答案:

答案 0 :(得分:28)

它们不是线程安全的。请改用Joda-time's version

或者将它们包装在synchronized方法中并使其成为线程安全的

Doc清楚地说明了

  

日期格式未同步。它   建议单独创建   每个线程的格式实例。如果   多个线程访问一种格式   同时,它必须同步   外部

答案 1 :(得分:15)

从Java 8开始,新的Date API支持此功能。 DateTimeFormatter是线程安全的,可以执行与SimpleDateFormat相同的工作。引自JavaDoc:

  

根据模式创建的格式化程序可以根据需要多次使用,它是不可变的并且是线程安全的。

为了更清楚,定义一个格式是完全正确的:

private static DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy MM dd");

并在可以由多个线程同时访问的方法中使用它:

String text = date.toString(formatter);
LocalDate date = LocalDate.parse(text, formatter);

答案 2 :(得分:2)

DateFormat不是线程安全的。如果多个线程使用相同的DateFormat对象而没有任何同步,则可能会得到意外结果。因此,您应该同步对DateFormat对象的访问,使用ThreadLocal变量或使用替代Date API,例如Joda-Time。

有关如何执行此操作的详细信息,请查看此博客文章:DateFormat with Multiple Threads

答案 3 :(得分:1)

答案 4 :(得分:-2)

静态应该不是问题。

由于AFAIK不保证线程安全,因此您必须检查源代码。即使你得出它是线程安全的结论,这可能会随着下一个版本而改变。 正如另一个回答所说,他们不是线程安全的。

你真的分配了如此大量的线程,给每个线程自己的格式是个问题吗?