java.text.SimpleDateFormat不是线程安全的

时间:2012-05-02 10:29:45

标签: java thread-safety simpledateformat

Synchronization

Date formats are not synchronized. It is recommended to create separate format instances for each thread. If multiple threads access a format concurrently, it must be synchronized externally

上面的行在SimpleDateFormat类的JavaDoc中提到。

这是否意味着我们不应该将SimpleDateFormat对象创建为静态。

如果我们将它创建为静态,那么无论我们在哪里使用这个对象,我们都需要将它保存在Synchronized Block中。

3 个答案:

答案 0 :(得分:22)

这是真的。您可以在StackOverflow上找到有关此问题的问题。我用它来声明ThreadLocal

private static final ThreadLocal<DateFormat> THREAD_LOCAL_DATEFORMAT = new ThreadLocal<DateFormat>() {
    protected DateFormat initialValue() {
        return new SimpleDateFormat("yyyyMMdd");
    }
};

并在代码中:

DateFormat df = THREAD_LOCAL_DATEFORMAT.get();

答案 1 :(得分:14)

是SimpleDateFormat不是线程安全的,并且在解析它应该以同步方式访问的日期时也建议使用它。

public Date convertStringToDate(String dateString) throws ParseException {
    Date result;
    synchronized(df) {
        result = df.parse(dateString);
    }
    return result;
}

另一种方式是http://code.google.com/p/safe-simple-date-format/downloads/list

答案 2 :(得分:9)

多数民众赞成。来自Apache Commons Lang的FastDateFormat是一个很好的线程安全替代方案。

从版本3.2开始,它支持解析,在3.2之前只支持格式化。