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);
解决问题并使其线程安全。
有人可以详细说明。
答案 0 :(得分:0)
DateFormat不是线程安全的,因为它是可变的,这意味着对象内的内容可以改变。在这种情况下声明volatile与声明final是一样有用,它仍然是线程不安全的。
DateFormat.getDateInstance(DateFormat.MEDIUM).parse(str)
的工作原因是因为它是不可变的。
DateFormat
是可变的是线程不安全的,因为parse的操作将以非原子方式设置被支持的可变日历的属性
因此,如果一个线程开始将Calendar的属性设置为一个日期,而另一个具有单独请求的线程开始将属性设置为另一个日期,则会遇到问题。