9
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 中。

4

3 回答 3

24

确实如此。您可以在 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();
于 2012-05-02T10:34:27.380 回答
16

是的 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

于 2012-05-02T10:38:10.793 回答
9

那是正确的。来自 Apache Commons Lang 的FastDateFormat是一个不错的线程安全替代方案。

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

于 2012-05-02T10:38:29.420 回答