1. 程式人生 > >Java多執行緒之使用volatile優雅地實現單例

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