SimpleDateFormat monthFormat = new SimpleDateFormat("MMMM");
SimpleDateFormat fullFormat = new SimpleDateFormat("EE MMM dd, HH:mm:ss")
static
我有几段这样的代码经常被调用,将它们声明为变量是否有意义?
在这种情况下,将动态参数传递给format()
方法是否是线程安全的?
SimpleDateFormat monthFormat = new SimpleDateFormat("MMMM");
SimpleDateFormat fullFormat = new SimpleDateFormat("EE MMM dd, HH:mm:ss")
static
我有几段这样的代码经常被调用,将它们声明为变量是否有意义?
在这种情况下,将动态参数传递给format()
方法是否是线程安全的?
不,它们不是线程安全的。请改用Joda-time 的版本 。
或者将它们包装在同步方法中并使其成为线程安全的
医生说得很清楚
日期格式不同步。建议为每个线程创建单独的格式实例。如果多个线程同时访问一个格式,它必须在外部同步。
从 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);
DateFormat 不是线程安全的。如果多个线程在没有任何同步的情况下使用相同的 DateFormat 对象,您可能会得到意想不到的结果。因此,您应该同步对 DateFormat 对象的访问,使用 ThreadLocal 变量或使用替代的 Date API,例如 Joda-Time。
有关如何执行此操作的更多信息,请查看此博客文章:DateFormat with Multiple Threads
如果您已经在使用 Apache Commons,则另一种选择:
静态应该不是问题。
由于 AFAIK 不保证线程安全,因此您必须检查源代码。即使你得出它是线程安全的结论,这也可能会随着下一个版本而改变。正如在另一个答案中所说,它们不是线程安全的。
你真的分配了这么多线程,给每个线程自己的 Format 是个问题吗?