設計模式之單例模式(懶漢 餓漢 雙重檢查加鎖)

2021-09-12 02:28:14 字數 1211 閱讀 3464

目錄

經典的實現方式

多執行緒問題

解決方案 懶漢

餓漢雙重檢查加鎖

在程式中,有些物件是只需要乙個的,比如執行緒池、快取、日誌物件等。這個時候,單例模式閃亮登場,它確保了乙個類只有乙個例項,並提供全域性訪問點。

下面是比較經典的實現方式,將構造器宣告為私有的,同時提供static修飾的getinstance()方法。

public class singleton 

public static singleton getinstance()

return instance;

}}

在多執行緒環境中,經典的實現方法其實是不安全的。例如兩個執行緒同時進入如下**塊,那麼會new出兩個不同的例項,那就違背了物件只有乙個的目的了。

if (null == instance)
為避免如上情況發生,在多執行緒中,單例模式有三種實現方式:懶漢(延遲載入)、餓漢及雙重檢查加鎖。下面我們將一一介紹。

在使用的時候才去初始化。

下面**中將getinstance()變為synchronized方法,保證了執行緒安全性;但是只有在第一次執行此方法時,才真正需要同步,所以一旦初始化完畢後,就每次呼叫這個方法,同步都是多餘的。

public class singleton 

public static synchronized singleton getinstance()

return instance;

}}

在靜態**塊中建立,即不管是否使用,都會先初始化。

public class singleton 

public static singleton getinstance()

}

首先會檢查例項是否建立,如果沒有,才進行同步。這樣的方式是對懶漢模式的一次效能公升級,在getinstance()中減少使用同步,保證只有在第一次時會同步。

public class singleton 

public static singleton getinstance() }}

return instance;

}}

此篇文章中心思想來自於《head first 設計模式》 之單件模式

單例模式之懶漢模式 餓漢模式

3.餓漢模式 4.二者對比 單例模式屬於建立型模式的一種,應用於保證乙個類僅有乙個例項的場景下,並且提供了乙個訪問它的全域性訪問點,如spring中的全域性訪問點beanfactory,spring下所有的bean都是單例。單例模式的特點 從系統啟動到終止,整個過程只會產生乙個例項。public c...

設計模式 單例模式 懶漢模式 餓漢模式

什麼是單例模式?就是自始至終只有乙個例項,不管new多少次物件,他們都指向同乙個引用。保證整個應用中某個例項有且只能有乙個。比如古代只能有乙個皇帝。一些物件我們只需要乙個,比如 配置檔案 工具類 執行緒池 快取 日誌物件等。如果創作出多個例項,就會導致很多問題,比如占用過多資源,不一致的結果等。單例...

單例設計模式(餓漢單例設計模式 懶漢單例設計模式)

1.什麼是單例 單例的意思是乙個類永遠只存在乙個物件,不能建立多個物件。2.為什麼要用單例 開發中有很多的物件我們只需要乙個,例如虛擬機器物件,任務管理器物件 物件越多越佔記憶體,有時候只需要乙個物件就可以實現業務,單例可以節省記憶體空間。3.如何實現單例 單例的實現方式有 餓漢單例設計模式 通過類...