架構師內功心法 單例模式

2021-10-22 09:02:56 字數 1917 閱讀 7851

註冊式threadlocal

問題作業

總結參考文件

單例模式是指在任何情況下都絕對只有乙個例項,並提供乙個全域性訪問點。屬於建立型模式。

單例模式的建立方式可分為以下四種:餓漢式、懶漢式、註冊式、threadlocal。

定義:在單例類首次載入時就建立例項。

特徵:私有化建構函式、提供全域性訪問點、靜態成員初始化

優點:執行效率高、執行緒安全

缺點:建立例項卻不使用造成記憶體浪費;系統啟動時大量單例被建立拉長了啟動時間。

定義:被外部類呼叫時才建立例項。

特徵:私有化建構函式、提供全域性訪問點

優點:節省記憶體、執行緒安全

缺點:效能低

第一次檢查是否需要阻塞執行緒,第二次檢查是否需要建立物件。

優點:節省記憶體、執行緒安全、效能高

缺點:可讀性差

instance =

newlazydoublechecksingleton()

;

該行**在jvm中包括三個操作:分配記憶體空間,執行建構函式,instance指向記憶體位址。

如果出現第二第三條指令重排的情況,那麼就會出現異常,因此需要volatile禁止指令重排。

優點:節省記憶體、執行緒安全、效能高、可讀性好

定義:將每乙個例項快取到統一的容器中,通過唯一標識獲取例項

包括列舉式與容器式兩種實現方式。

優點:執行緒安全、可讀性好

缺點:造成記憶體浪費

優點:節省記憶體

缺點:執行緒不安全。改進見作業

定義:保證執行緒內的全域性唯一

缺點:受限於當前執行緒

1.指令重排序問題: 編譯器指令重排序和cpu指令重排序

2.volatile:保證多執行緒共享變數可見性及禁止指令重排。

通過雙重檢查鎖保證執行緒安全

反射破壞部分單例形式,解決方式:在建構函式中判斷單例是否存在(部分單例方式需要考慮執行緒安全問題)

反序列化破壞所有單例形式(列舉類除外),解決方式:單例類中新增readresolve方法返回當前單例物件。

單例模式的要點如下:

1.私有化建構函式,提供全域性訪問點

2.延遲載入(節省記憶體)

3.保證執行緒安全

4.防止反射破壞

5.防止反序列化破壞

記憶體屏障

指令重排序

volatile

volatile2

架構師之路 理解設計模式

目錄 為什麼會有設計模式?設計模式的定義 設計模式的元素 設計模式的學習和運用 你曾經多少次有過這種感覺 你已經解決過了乙個問題,但就是不能確切知道是在什麼地方或怎麼解決的?如果你能記起以前問題的細節和怎麼解決它的,你就可以復用以前的經驗而不需要重新發現它。然而,我們並沒有很好記錄下可供他人使用的軟...

架構師應該掌握哪些設計模式

今天去參加了北京博文視點出版社在上海辦的乙個open party http www.douban.com event 11051981 其中有兩個topic給我很大的啟發,乙個是溫昱的 架構 設計的事實與謬誤 另乙個是老趙 jeffz cn 的 web應用中的快取 當然,我的收穫未必是他們兩位想要傳...

大話設計模式 架構師成長之路

大話設計模式 架構師成長之路 第八章 關注物件之間的通訊 行為型模式應用 上 8.1 三十六計 玩轉策略模式和應用場景.mp4 42.78m 8.2 策略設計模式實戰之電商多場景 活動方案.mp4 190.41m 8.3 大象裝進冰箱分幾步模板方法設計模式介紹.mp4 81.58m 8.4 專案里程...