雙重檢查 單例模式 會出現空指針問題
阿新 • • 發佈:2017-07-20
其他 說明 空指針問題 ron 沒有 clas singleton 構造方法 code
public static Singleton getInstance() { if (instance == null) { synchronized(Singleton.class) { //1 if (instance == null) //2 instance = new Singleton(); //3 } } return instance; }
簡單的理解:
由於java實例化一個對象的操作(new)不是原子性的。所以在線程a 在執行到 代碼 3 處時,當3完成了一部分時,instance就已經非null了,
但是此時實例對象並沒有構造完成。假如這個時候線程b進來if語句就會得道instance不是null, 會直接拿到未完成的 instance,從而導致空指針。
說明:
java創建一個對象,在java虛擬機上會進行以下三步操作
1、給instance分配內存
2、調用構造方法 初始化
3、指向內存分配區域
這裏牽涉到一個重排序的問題。也就是123的執行順序是隨機的。而其中的3執行完後對象就不為null了
所以當3在2的前面執行時,當2執行完3還未執行時,其他線程進來就會返回未執行3的實例對象,從而導致空指針
雙重檢查 單例模式 會出現空指針問題