一、privat static Singleton 要加votatile關鍵字修飾,防止對象的初始化代碼與引用賦值代碼進行重排序。spa
二、getInstance方法,最外層要加if (instance == null),而後加鎖synchronized,而後再加if (instance == null)的判斷線程
三、內層if (instance == null) 判斷的做用是,若是沒有這個內層的判斷,多個線程都進入了外層的if (instance == null) 判斷,並在鎖的地方等待,那麼勢必會依次建立N個重複的對象,不是單例了。code
示例代碼以下:對象
public class Singleton { // 經過volatile關鍵字的使用,防止編譯器將 // 一、初始化對象,二、給對象引用賦值 // 這兩步進行重排序 private static volatile Singleton instance = null; private Singleton() { } public static Singleton getInstance() { if (instance == null) { synchronized (instance) { if (instance == null) { instance = new Singleton(); } } } return instance; } }