让我们以SimpleDateFormat为例,因为它不是线程安全的。java中的volatile和threadLocal
我可以让每个线程使用的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'具有可变状态,这与引用是否存储在易失性字段中无关。 –
线程局部变量和volatile变量不一样!对于线程本地,每个线程都有一个单独的变量副本。使用volatile,所有线程共享一个变量。像Andy提到的那样,使变量volatile成为线程安全的是因为SimpleDateFormat具有不能由多个线程同时更新的内部状态。 – Jesper