線程安全的Singleton要點

一、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;
    }

}
相關文章
相關標籤/搜索