0
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); 解决问题并使其成为线程安全的。

有人可以详细说明一下。

4

1 回答 1

0

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

之所以DateFormat.getDateInstance(DateFormat.MEDIUM).parse(str)有效,是因为它是不可变的。

DateFormat在这种情况下可变是线程不安全的,因为 parse 的操作将以非原子方式设置支持的可变 Calendar 的属性

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

于 2013-11-07T13:57:21.943 回答