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

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

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

4

5 回答 5

31

,它们不是线程安全的。请改用Joda-time 的版本

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

医生说得很清楚

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

于 2011-05-26T11:11:21.353 回答
24

从 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);
于 2015-05-07T16:27:58.200 回答
2

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

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

于 2011-05-26T11:22:21.850 回答
2

如果您已经在使用 Apache Commons,则另一种选择:

https://commons.apache.org/proper/commons-lang/javadocs/api-2.6/org/apache/commons/lang/time/FastDateFormat.html

于 2015-01-20T18:27:18.600 回答
-2

静态应该不是问题。

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

你真的分配了这么多线程,给每个线程自己的 Format 是个问题吗?

于 2011-05-26T11:15:15.193 回答