在Java SimpleDateFormat中使用parse()时的线程安全性

时间:2016-03-24 06:33:56

标签: java thread-safety simpledateformat

我尽力研究源代码,找出为什么它在SimpleDateFormat中对于parse()不是线程安全的。但我仍然不知道在哪里摧毁竞争条件

4 个答案:

答案 0 :(得分:2)

SimpleDateFormat使用DateFormat的calendar字段来存储要解析的当前日期。该字段周围没有同步,因此并行使用相同的SimpleDateFormat对象可能会并行更改calendar值,从而导致结果出现乱码。

PS-I仔细阅读了这段源代码:http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/6-b14/java/text/SimpleDateFormat.java#SimpleDateFormat.parse%28java.lang.String%2Cjava.text.ParsePosition%29

因人而异。

答案 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)

如果我正确理解了您的问题,您可以使用threadlocale

dictionary

从此link