SimpleDateFormat monthFormat = new SimpleDateFormat("MMMM");
SimpleDateFormat fullFormat = new SimpleDateFormat("EE MMM dd, HH:mm:ss")
我有几个这样的代码经常被调用,将它们声明为static
变量是否有意义?
在这种情况下,将动态参数传递给format()
方法是否安全?
答案 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)
如果您已经在使用Apache Commons,则可以选择
答案 4 :(得分:-2)
静态应该不是问题。
由于AFAIK不保证线程安全,因此您必须检查源代码。即使你得出它是线程安全的结论,这可能会随着下一个版本而改变。 正如另一个回答所说,他们不是线程安全的。
你真的分配了如此大量的线程,给每个线程自己的格式是个问题吗?