Java 設計模式(4) —— 單例模式

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設計模式全部示例代碼,持續更新中

相關文章
相關標籤/搜索