讓我們以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