让我们以SimpleDateFormat作为例子,因为它不是线程安全的。
我可以通过使用threadLocal来允许每个线程拥有自己的SimpleDateFormat副本,如下所示:
private static final ThreadLocal<SimpleDateFormat> formatter = new ThreadLocal<SimpleDateFormat>(){
@Override
protected SimpleDateFormat initialValue()
{
return new SimpleDateFormat("yyyyMMdd HHmm");
}
};
但是volatile关键字保证一个线程拥有变量的最新副本。所以,我能否改为这样做:
volatile SimpleDateFormat myformatter;
并且实现相同的线程安全性?
SimpleDateFormat
具有可变状态,这与引用是否存储在易失性字段中无关。 - Andy Turnervolatile
并不相同!使用本地线程,每个线程都有变量的单独副本。而使用volatile
,所有线程共享一个变量。将变量设为volatile
并不能使其线程安全,因为SimpleDateFormat
存在内部状态,不应由多个线程同时更新,正如 Andy 所提到的。 - Jesper