什么是單例模式
- 單例模式(Singleton Pattern)是一個比較簡單的模式,實際應用很廣泛,比如 Spring 中的
Bean實體就是一個單例物件, - 文章首發于作者微信公眾號【碼猿技術專欄】設計模式:單例模式,原創不易,喜歡的支持一下!!!!
- 定義:確保某一個類 只有一個實體,而且自行實體化并向整個系統提供這個實體,
單例模式的優缺點
- 評價任何一種事務都要從兩個方面去看,不能單一的評價,下面來看看單例模式有什么優缺點,
優點
- 只有一個實體,減少了記憶體的開銷,尤其是頻繁的創建和銷毀實體,
- 單例模式可以避免對資源的多重占用,例如一個寫檔案動作,由于只有一個實體存在 記憶體中,避免對同一個資源檔案的同時寫操作,
- 單例模式可以在系統設定全域的訪問點,優化和共享資源訪問,例如可以設計一個單 例類,負責所有資料表的映射處理,
缺點
- 單例模式一般沒有介面,很難擴展(根據環境而定),
- 單例模式與單一職責原則有沖突,一個類應該只實作一個邏輯,而不關心是否是單例的,
單例模式的實作
- 單例模式有很多的實作方式,但是各種實作的方式都有其優缺點,下面來看看各種的實作方式,
- 單例模式的實作滿足以下幾點:
- 構造方法私有,
- 有一個靜態方法獲取該類的實體,
- 該類保證只有一個實體,
懶漢式
- 懶漢式是當用到這個物件的時候才會創建,
- 優點:只有用到的時候才會創建這個物件,因此節省資源,
- 簡單的實作如下:
public class Singleton {
private static Singleton instance;
private Singleton (){}
public static Singleton getInstance() {
if (instance == null) {
instance = new Singleton();
}
return instance;
}
}
- 上面的代碼算是基本滿足了單例模式,但是不能滿足執行緒安全,一旦在多執行緒的環境下仍然是不能保證該類是單例的,
- 如何保證執行緒安全,當然是加鎖了,我們可以加執行緒同步鎖
synchronized,實作如下:
public class Singleton {
private static Singleton instance;
private Singleton (){}
public static synchronized Singleton getInstance() {
if (instance == null) {
instance = new Singleton();
}
return instance;
}
}
- 此種實作方式雖然滿足了執行緒安全,但是加鎖勢必會影響性能,
餓漢式
- 餓漢式和懶漢式恰巧相反,在類加載的時候就創建實體,
- 優點:還沒用到就創建,浪費資源,
- 缺點:在類加載的時候就創建,執行緒安全,
- 實作如下:
public class Singleton {
private static Singleton instance = new Singleton();
private Singleton (){}
public static Singleton getInstance() {
return instance;
}
}
雙重校驗鎖
- 屬于懶加載的一種實作方式,采用雙重校驗的機制,在多執行緒的情況仍然保持高性能,
- 實作如下:
public class Singleton {
private volatile static Singleton singleton;
private Singleton (){}
public static Singleton getSingleton() {
if (singleton == null) {
synchronized (Singleton.class) {
if (singleton == null) {
singleton = new Singleton();
}
}
}
return singleton;
}
}
匿名內部類/靜態內部類
- 利用靜態變數、靜態代碼塊、靜態方法都是在類加載的時候只加載一次的原理,
- 實作如下:
public class Singleton {
private static class SingletonHolder {
private static final Singleton INSTANCE = new Singleton();
}
private Singleton (){}
public static final Singleton getInstance() {
return SingletonHolder.INSTANCE;
}
}
總結
- 單例模式的實作雖然很簡單,但是也要確保實作的性能和執行緒安全的問題,
- 單例模式的實作主流的就是以上介紹的幾種,分別是
懶漢式執行緒不安全、懶漢式執行緒安全、餓漢式、雙重校驗鎖的實作、靜態內部類的實作,這幾種方式各有優缺點,陳某推薦使用靜態內部類的實作方式, - 單例模式也是Spring使用的一種設計模式,保證了
Bean的單實體才能管理和監控Bean的創建和銷毀,
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/16312.html
標籤:設計模式
上一篇:圖解Java設計模式之策略模式
下一篇:圖解Java設計模式之職責鏈模式
