Java多執行緒之使用volatile優雅地實現單例
阿新 • • 發佈:2019-01-01
關於volitale關鍵字
volitale即是揮發物,被該關鍵字修飾變數的值發生改變時,會導致該變數的CPU快取失效,必須CPU需要重新去記憶體拉取最新的值。
該關鍵字保證了變數的可見性(用一句術語:對於變數的寫入操作總是happens-before每一個後續的對該變數的讀寫操作,也就是保證了更新後的變數,後續的程式總能看到),即該變數發生改變時,在改時間點之後執行的程式碼可以立即看到變化。
volitale在jdk中一般的應用場景常常與 for死迴圈一起出現,表示在volitale變數達到某個條件時進行CAS操作。
詳細實現原理請參考:http://ifeve.com/volatile/
因此可以利用volitale關鍵字的可見性來實現絕對安全的單例,程式碼如下所示:
/**
* 使用volatile優雅地實現單例
* Created by dingxiangyong on 2016/5/3.
*/
public class Singleton {
//單例
private static volatile Singleton instance = null;
private Singleton(){
}
/**
* get instance
* @return
*/
public static Singleton getInstance(){
if (instance == null ){
synchronized (Singleton.class){
if (instance == null){
instance = new Singleton();
}
}
}
return instance;
}
}