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