雙重檢查 單例模式 會出現空指針問題

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

相關文章
相關標籤/搜索