1. 程式人生 > >雙重檢查 單例模式 會出現空指針問題

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

其他 說明 空指針問題 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的實例對象,從而導致空指針

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