雙重檢鎖模式volatile關鍵字的作用

package com.com.hangzhou.singleton;

/**
 * 單例模式  雙重檢鎖模式
 */
public class SingletonDemo {

    //volatile變量  保證可見性、禁止指令重排序   不保證原子性
    private volatile SingletonDemo singletonDemo;

    public SingletonDemo getSingletonDemo() {
        if (singletonDemo == null) {
            synchronized (SingletonDemo.class) {
                if (singletonDemo == null) {
                    //三步執行:
                    // 1.爲singletonDemo分配內存空間
                    // 2.初始化singletonDemo
                    // 3.將singletonDemo指向分配的內存地址
                    //但是由於JVM具有指令重排的特性,執行的順序可能會1>3>2,
                    // 指令重排在單線程下不會有線程安全問題,
                    // 但在多線程環境下,會導致一個線程獲得還沒有初始化的實例
                    //例如線程T1執行1、3,此時線程T2調用getSingletonDemo()方法後發現singletonDemo不爲空,
                    //因此返回singletonDemo,但此時singletonDemo 還未被實例化
                    //使用volatile關鍵字可以禁止指令重排序,保證在多線程環境下能正常運行
                    singletonDemo = new SingletonDemo();
                }

            }
        }
        return singletonDemo;
    }
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章