1、單例模式
確保一個類最多隻有一個實例,並提供一個全局訪問點程序員
2、爲何會須要單例
有些對象咱們只須要一個:線程池、緩存、硬件設備等
若是多個實例會有形成衝突、結果的不一致性等問題
是否能夠用靜態變量方式來實現?
或者程序員之間協商個全局變量?
3、單例模式的實現/**設計模式
*/
public class Singleton {緩存
private static Singleton uniqeInstance = null; private Singleton() { } // 利用靜態方法和靜態變量實現簡單的單例 public static Singleton getInstance() { if (uniqeInstance == null) { uniqeInstance = new Singleton(); } return uniqeInstance; }
}
4、單例模式的優化安全
多線程的狀況下爲保證線程安全,須要對單例模式進行優化處理多線程
優化方式:優化
1.同步(synchronized)getInstance方法
public static synchronized ChocolateFactory getInstance() {線程
if (uniqueInstance == null) { synchronized (ChocolateFactory.class) { if (uniqueInstance == null) { uniqueInstance = new ChocolateFactory(); } } } return uniqueInstance; }
該方法利用synchronized關鍵字加了同步鎖,可是比較耗資源,每次都得加鎖設計
2.「急切」建立實例
public class ChocolateFactory {code
private boolean empty; private boolean boiled; public static ChocolateFactory uniqueInstance = new ChocolateFactory(); private ChocolateFactory() { empty = true; boiled = false; }
}
該方法在程序啓動的時候就建立了一個對象,就算無調用也建立了,耗內存空間對象
3.雙重檢查加鎖(最優)
public class ChocolateFactory {
private boolean empty; private boolean boiled; public volatile static ChocolateFactory uniqueInstance = null; private ChocolateFactory() { empty = true; boiled = false; } public static ChocolateFactory getInstance() { if (uniqueInstance == null) { synchronized (ChocolateFactory.class) { if (uniqueInstance == null) { uniqueInstance = new ChocolateFactory(); } } } return uniqueInstance; }
}
利用volatile關鍵字和雙重驗證以及同步鎖,即保證了內存的合理分配和原子性,也無需每次都加上同步鎖
Java設計模式全部示例代碼,持續更新中