關於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;
}
}