我尽力研究源代码,找出为什么它在SimpleDateFormat中对于parse()不是线程安全的。但我仍然不知道在哪里摧毁竞争条件
答案 0 :(得分:2)
SimpleDateFormat使用DateFormat的calendar
字段来存储要解析的当前日期。该字段周围没有同步,因此并行使用相同的SimpleDateFormat对象可能会并行更改calendar
值,从而导致结果出现乱码。
因人而异。
答案 1 :(得分:0)
为了避免竞争条件,每次都要创建新的private static final String DATE_FORMAT = "...";
private void foo() {
SimpleDateFormat df = new SimpleDateFormat(DATE_FORMAT);
...
}
,并且只共享格式字符串:
SimpleDateFormat
如果(且仅当)性能成为问题,您可以为每个线程创建一个compiledPattern
实例。但通常每次要使用它时都要创建一个新实例。
答案 2 :(得分:0)
SimpleDateFormat在其解析方法中也使用transient private char[] compiledPattern;
,该方法定义为:
printFrequency
答案 3 :(得分:-1)