單例模式的實現

2021-08-16 09:34:03 字數 2555 閱讀 7388

單例設計模式保證類在記憶體中只存在乙個物件。根據不同的策略,單例類的實現有以下幾種方式。

1. 立即載入

在載入類的同時例項化物件,設計要點如下:

(1)私有化構造方法;

(2)宣告並例項化本類物件(靜態);

(3)提供公有靜態方法獲取物件。

code 1

public class eagersingleton 

// other private constructors

private static eagersingleton instance = new eagersingleton();

public static eagersingleton getinstance()

// other methods

}

當成員不可變時,也可直接暴露給外部使用,簡化如下:

code 2

public class eagersingleton 

// other private constructors

public static final eagersingleton instance = new eagersingleton();

// other methods

}

2. 延遲載入(懶載入)

物件第一次使用時例項化,設計要點如下:

(1)私有化構造方法;

(2)宣告本類的靜態引用;

(3)提供公有靜態方法獲取物件,第一次獲取時例項化。

code 3

public class lazysingleton 

// other private constructors

private static lazysingleton instance = null;

public static lazysingleton getinstance()

// other methods

}

上述實現方式具有執行緒安全問題,當多個執行緒同時呼叫getinstance方法時,可能會建立多個例項。以下採用同步的方式解決執行緒安全問題:

code 4

public class lazysingleton 

// other private constructors

private static volatile lazysingleton instance = null;

public static lazysingleton getinstance()

return instance;

}// other methods

}

code 4 中的volatile關鍵字有兩個作用:

(1)保證執行緒可見性:乙個執行緒對volatile變數的修改會立即由工作記憶體(執行緒獨享)寫回主記憶體(執行緒共享),volatile使變數的修改可以及時反映到其他執行緒中;

(2)禁止指令重排序:由於編譯器的優化,**的實際執行順序與編寫順序可能不一致。volatile關鍵字可禁止這種優化(jdk 1.5之後)。

code 4 可以解決執行緒安全問題,但執行效率很低。因為例項化僅在第一次呼叫時執行,而每次獲取例項時均要同步,執行緒排隊導致效率降低。以下採用雙重檢查的方式避免執行緒排隊:

code 5

public class lazysingleton 

// other private constructors

private static volatile lazysingleton instance;

public static lazysingleton getinstance()

}return instance;

}// other methods

}

上述實現略顯繁瑣,但可兼顧效率與安全(要求jdk版本至少為1.5)。

3. 列舉方式

列舉實現單例類最為簡單,可以保證執行緒安全,同時可以防止通過反射呼叫私有方法。

code 6

public enum enumsingleton
由於列舉類占用記憶體較多,移動開發不建議使用。

4. 靜態內部類方式

因為靜態內部類只會載入一次,並且僅在第一次訪問時才載入,所以能夠實現延遲載入,同時保證執行緒安全。

code 7

public class staticinnerclasssingleton 

// other private constructors

public static staticinnerclasssingleton getinstance()

// other methods

private static class staticinnerclass

}

總結:單例類最常見的實現方式是立即載入和延遲載入,採用延遲載入時要注意執行緒安全問題。列舉可以簡化實現,但占用資源相對較多。

單例模式的實現

單例模式估計是咱們碰到最多也是最簡單的一種設計模式了 也是面試中經常會遇到的面試題 單例模式保證乙個類只有乙個例項,比如咱們在android應用中登入成功之後儲存使用者資訊就會優先考慮單例模式。單例模式有六種常規的寫法 餓漢式 懶漢式 執行緒不安全 懶漢式 執行緒安全 dcl雙重校驗模式 靜態內部類...

單例模式的實現

單例模式的實現需要考慮的因素有很多。對於常常出現的double checked實現單例模式實際上是不安全的實現 private static singleton instance public static singleton getinstance 因為jit可以在singleton的構造方法被執...

單例模式的實現

單例 保證乙個類僅有乙個例項,並提供乙個訪問它的全域性訪問點。單例模式是一種常用的軟體設計模式之一,其目的是保證整個應用中只存在類的唯一個例項。比如我們在系統啟動時,需要載入一些公共的配置資訊,對整個應用程式的整個生命週期中都可見且唯一,這時需要設計成單例模式。如 spring容器,session工...