代碼詳解設計模式--單例模式

單例模式

  單例模式的目的是:保證一個類僅有一個實例,並提供一個訪問它的全局訪問點。

  • 優點:
  1. 在內存裏只有一個實例,減少了內存的開銷,尤其是頻繁的創建和銷燬實例。
  2. 避免對資源的多重佔用。
  • 缺點:
  1. 沒有接口,不能繼承,與單一職責原則衝突。

懶漢式

public class Singleton {  
    private static Singleton instance;  
    private Singleton (){}  
  
    public static [synchronized] Singleton getInstance() {  
        if (instance == null) {  
            instance = new Singleton();  
        }  
        return instance;  
    }  
}

本方式中,用synchronized修飾時是線程安全的

餓漢式 [線程安全]

public class Singleton {  
    private static Singleton instance = new Singleton();  
    private Singleton (){}
    
    public static Singleton getInstance() {  
    	return instance;  
    }  
}

雙檢鎖 [線程安全]

public class Singleton {  
    private volatile static Singleton instance;  
    private Singleton (){}
    
    public static Singleton getInstance() {  
        if (instance == null) {  //第一次檢查
            synchronized (Singleton.class) {  
                if (instance == null) {  //第二次檢查
                    instance = new Singleton();  
                }  
            }  
        }  
        return instance;  
    }  
}

雙重檢查加鎖機制:並不是每次進入getInstance方法都需要同步,而是先檢查實例是否存在,如果不存在才進入下面的同步塊,這是第一重檢查。進入同步塊過後,再次檢查實例是否存在,如果不存在,就在同步的情況下創建一個實例,這是第二重檢查。這樣一來減少了多次在同步情況下進行判斷所浪費的時間。

靜態內部類 [線程安全]

public class Singleton {  
    private Singleton (){}  
    
    public static final Singleton getInstance() {  
    	return SingletonHolder.INSTANCE;  
    }
    
    private static class SingletonHolder {  
    	private static final Singleton INSTANCE = new Singleton();  
    }
}

枚舉類 [線程安全]

public enum Singleton {  
    INSTANCE;  
    public void whateverMethod() {  
    }  
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章