Java多線程之使用volatile優雅地實現單例

關於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;
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章