保證乙個類只有乙個例項,並且提供乙個訪問該例項的全域性訪問點。
單例模式的優點:
1.由於單例模式只生成乙個例項,減少了系統效能開銷,當乙個物件的產生需要比較多的資源時,如讀取配置、產生其他依賴物件時,則可以通過在應用啟動時直接產生乙個單例物件,然後永久駐留記憶體的方式來解決
2.單例模式可以在系統設定全域性的訪問點,優化環共享資源訪問,例如可以設計乙個單例類,負責所有資料表的對映處理
常見的五種單例模式:
-主要:
·餓漢式(執行緒安全,呼叫效率高。但是,不能延時載入。)
·懶漢式(執行緒安全,呼叫效率不高。但是,可以延時載入。)
-其他:
·雙重檢測鎖式(由於jvm底層內部模型原因,偶爾會出問題。不建議使用)
·靜態內部類式(執行緒安全,呼叫效率高。但是,可以延時載入)
·列舉單例(執行緒安全,呼叫效率高,不能延時載入)
餓漢式:
//類初始化時,立即載入這個物件(沒有延時載入的優勢)。載入類時,天然的是執行緒安全的!
private static singletondemo1 instance = new singletondemo1();
private singletondemo1()
//方法沒有同步,呼叫效率高!
public static singletondemo1 getinstance()
·餓漢式單例模式**中,static變數會在類裝載時初始化,此時也不會涉及多個執行緒物件訪問該物件的問題。虛擬機器保證只會裝載一次該類,肯定不會發生併發訪問的問題。因此,可以省略synchronized關鍵字。
·問題:如果只是載入本類,而不是要呼叫qetinstance,甚至永遠沒有呼叫,則會造成資源浪費!
懶漢式:
//類初始化時,不初始化這個物件(延時載入,真正用的時候再建立)。
private static singletondemo2 instance;
private singletondemo2()
//方法同步,呼叫效率低!
public static synchronized singletondemo2 getinstance()
return instance;
}
·要點:
-lazy load,延遲載入,真正用的時候才載入.
·問題:
-資源利用率高了。但是,每次呼叫getinstance()方法都要同步,併發效率較低。
雙重檢測鎖式:
private static singletondemo3 instance = null;
public static singletondemo3 getinstance()
} instance = sc;
} }
} return instance;
} private singletondemo3()
1.這個模式將同步內容下方到if內部,提高了執行的效率不必每次獲取物件時都進行同步,只有第一次才同步建立了以後就沒必要了。
2.問題:由於編譯器優化原因和jvm底層內部模型原因,偶爾會出問題。不建議使用。
·靜態內部類式:
private static class singletonclassinstance
private singletondemo4()
//方法沒有同步,呼叫效率高!
public static singletondemo4 getinstance()
1.外部類沒有static屬性,則不會像餓漢式那樣立即載入物件。
2.只有真正呼叫getinstance(),才會載入靜態內部類。載入類時是執行緒安全的。instance是static final型別,保證了記憶體中只有這樣乙個例項存在,而且只能被賦值一次,從而保證了執行緒安全性.
3.兼備了併發高效呼叫和延遲載入的優勢!
列舉單例:
public enum singletondemo5
}
1.實現簡單
2.列舉本身就是單例模式。由jvm從根本上提供保障,避免通過反射和反序列化的漏洞。
3.無法延時載入
設計模式GOF23之單例模式
單例模式的五種方式 主要 懶漢式,餓漢式 其他 雙重檢測鎖 double checking模式 靜態內部類,列舉模式 選取時機 延時載入,占用內部資源大 靜態內部類好於懶漢 不延時載入,占用內部資源小 列舉好於餓漢 單例模式 懶漢式 author 小帆敲 public class demo01 上鎖...
設計模式GOF23之單例模式
單例模式的五種方式 主要 懶漢式,餓漢式 其他 雙重檢測鎖 double checking模式 靜態內部類,列舉模式 選取時機 延時載入,占用內部資源大 靜態內部類好於懶漢 不延時載入,占用內部資源小 列舉好於餓漢 單例模式 懶漢式 author 小帆敲 public class demo01 上鎖...
GOF23設計模式 單例(2)
package org.test.singleton classname singletondemo3 description 雙重檢測鎖實現單例 不考慮 author administrator date 2017年3月30日 public class singletondemo3 public ...