Java DateFormat Threadsafety

时间:2013-11-07 13:42:03

标签: multithreading thread-safety

final class DateHandler  
{
    private static volatile DateFormat format = DateFormat.getDateInstance(DateFormat.MEDIUM);

    public static Date parse(String str) throws ParseException 
    {
        return format.parse(str);
    }
}

由于DateFormat不是线程安全的,parse()方法可能会返回Date的值,该值与str参数不对应。 但用{替换return语句   DateFormat.getDateInstance(DateFormat.MEDIUM).parse(str); 解决问题并使其线程安全。

有人可以详细说明。

1 个答案:

答案 0 :(得分:0)

DateFormat不是线程安全的,因为它是可变的,这意味着对象内的内容可以改变。在这种情况下声明volatile与声明final是一样有用,它仍然是线程不安全的。

DateFormat.getDateInstance(DateFormat.MEDIUM).parse(str)的工作原因是因为它是不可变的。

在这种情况下,

DateFormat是可变的是线程不安全的,因为parse的操作将以非原子方式设置被支持的可变日历的属性

因此,如果一个线程开始将Calendar的属性设置为一个日期,而另一个具有单独请求的线程开始将属性设置为另一个日期,则会遇到问题。