日期格式不是线程安全的,这意味着它们维护状态的内部表示。如果多个线程同时访问同一个实例,在静态上下文中使用它们可能会产生一些非常奇怪的错误。
我的建议是将变量设置为使用它们的地方的局部变量,而不是将它们设置为类的静态属性。在初始化类时,您可能正在执行此操作,因此可以在构造函数中执行此操作:
public class MyClass {
private String fileName;
public MyClass() {
final Date today = Calendar.getInstance().getTime();
final DateFormat yymmdd = new SimpleDateFormat("yyMMdd");
this.fileName = "file_" + yymmdd.format(TODAY);
}
...
}
如果您需要在多个地方使用格式化程序,您可以只制作模式
static final
并创建一个新的本地
DateFormat
需要时:
public class MyClass {
private static final String FILENAME_DATE_PATTERN = "yyMMdd";
public void myMethod() {
final DateFormat format = new SimpleDateFormat(FILENAME_DATE_PATTERN);
// do some formatting
}
}
正如javadoc所说,日期格式是
多线程固有的不安全性
使用。探测器发现有人打电话给
具有
通过静电场获得。这个
看起来可疑。
有关更多信息,请参阅Sun。
Bug 6231579和Sun Bug 6178997。
日期格式不同步。它
建议单独创建
为每个线程设置实例格式。如果
多线程访问一种格式
同时,必须同步
外部。
Jack Leow's answer
对于静态使用“today”的语义也有一个很好的观点。
顺便说一句,我实际上已经看到这种情况发生在高流量的生产环境中,而且一开始调试是一件非常令人困惑的事情;因此,根据我的经验,findbugs警告实际上是一个有用的建议(与其他一些静态分析规则不同,这些规则有时看起来很挑剔)。