public static Singleton getInstance() { if (instance == null) { synchronized(Singleton.class) { //1 if (instance == null) //2 instance = new Singleton(); //3 } } return instance; }
簡單的理解:java
因爲java實例化一個對象的操做(new)不是原子性的。因此在線程a 在執行到 代碼 3 處時,當3完成了一部分時,instance就已經非null了,spa
可是此時實例對象並無構造完成。假如這個時候線程b進來if語句就會得道instance不是null, 會直接拿到未完成的 instance,從而致使空指針。線程
說明:指針
java建立一個對象,在java虛擬機上會進行如下三步操做code
一、給instance分配內存對象
二、調用構造方法 初始化blog
三、指向內存分配區域排序
這裏牽涉到一個重排序的問題。也就是123的執行順序是隨機的。而其中的3執行完後對象就不爲null了內存
因此當3在2的前面執行時,當2執行完3還未執行時,其餘線程進來就會返回未執行3的實例對象,從而致使空指針get