確保物件的唯一性——單例模式 (四)
3.5 一種更好的單例實現方法
餓漢式單例類不能實現延遲載入,不管將來用不用始終佔據記憶體;懶漢式單例類執行緒安全控制煩瑣,而且效能受影響。可見,無論是餓漢式單例還是懶漢式單例都存在這樣那樣的問題,有沒有一種方法,能夠將兩種單例的缺點都克服,而將兩者的優點合二為一呢?答案是:Yes!下面我們來學習這種更好的被稱之為Initialization Demand Holder (IoDH)的技術。
在IoDH中,我們在單例類中增加一個靜態(static)內部類,在該內部類中建立單例物件,再將該單例物件通過getInstance()方法返回給外部使用,實現程式碼如下所示:
//Initialization on Demand Holder
class Singleton {
private Singleton() {
}
private static class HolderClass {
private final static Singleton instance = new Singleton();
}
public static Singleton getInstance() {
return HolderClass.instance;
}
public static void main(String args[]) {
Singleton s1, s2;
s1 = Singleton.getInstance();
s2 = Singleton.getInstance();
System.out.println(s1==s2);
}
}
編譯並執行上述程式碼,執行結果為:true,即建立的單例物件s1和s2為同一物件。由於靜態單例物件沒有作為Singleton的成員變數直接例項化,因此類載入時不會例項化Singleton,第一次呼叫getInstance()時將載入內部類HolderClass,在該內部類中定義了一個static型別的變數instance,此時會首先初始化這個成員變數,由Java虛擬機器來保證其執行緒安全性,確保該成員變數只能初始化一次。由於getInstance()方法沒有任何執行緒鎖定,因此其效能不會造成任何影響。
通過使用IoDH,我們既可以實現延遲載入,又可以保證執行緒安全,不影響系統效能,不失為一種最好的Java語言單例模式實現方式(其缺點是與程式語言本身的特性相關,很多物件導向語言不支援IoDH)。
|
至此,三種單例類的實現方式我們均已學習完畢,它們分別是餓漢式單例、懶漢式單例以及IoDH。
【作者:劉偉 http://blog.csdn.net/lovelion】
相關文章
- 確保物件的唯一性——單例模式 (五)物件單例模式
- 確保物件的唯一性——單例模式 (三)物件單例模式
- 確保物件的唯一性——單例模式 (二)物件單例模式
- 設計模式系列之單例模式(Singleton Pattern)——確保物件的唯一性設計模式單例物件
- 單例模式的正確寫法單例模式
- 【指令碼】如何確保應用程式的唯一性指令碼
- JS 建立例項物件的四種模式JS物件模式
- 確保您擁有一個獨一無二的例項:單例模式的建立方式單例模式
- 單例模式 - 確定 N 先生的GrilFriend單例模式
- 如何正確地寫出單例模式單例模式
- PHP設計模式(四)單例模式(Singleton)PHP設計模式單例
- Singleton(單例)——物件建立型模式單例物件模式
- 設計模式之“物件效能模式”: Singleton 單例模式(筆記)設計模式物件單例筆記
- 您的單例模式,真的單例嗎?單例模式
- 物件的克隆——原型模式(四)物件原型模式
- JAVA物件導向高階:static的應用知識--單例模式 單例設計模式應用場景及好處 單例設計模式的實現方式Java物件單例設計模式
- 單例模式單例模式
- iOS單例物件iOS單例物件
- JS中的單例模式及單例模式原型類的實現JS單例模式原型
- DCL單例模式中的缺陷及單例模式的其他實現單例模式
- 【極客思考】設計模式:你確定你真的理解了單例模式嗎?設計模式單例
- Scala單例物件、伴生物件單例物件
- 單例模式(下)---聊一聊單例模式的幾種寫法單例模式
- 單例模式(下) - 聊一聊單例模式的幾種寫法單例模式
- 單例模式(下) – 聊一聊單例模式的幾種寫法單例模式
- Flutter 中的單例模式Flutter單例模式
- Flutter(able) 的單例模式Flutter單例模式
- 單例模式的實現單例模式
- javascript單例模式的理解JavaScript單例模式
- 單例模式static的困惑單例模式
- 設計模式-單例模式設計模式單例
- [設計模式] 單例模式設計模式單例
- 設計模式 —— 單例模式設計模式單例
- 設計模式(單例模式)設計模式單例
- 建立型模式:單例模式模式單例
- 創造模式 單例模式模式單例
- 設計模式——單例模式設計模式單例
- 設計模式--單例模式設計模式單例