設計模式 - 單例模式Singleton的8種寫法
.
阻止別人建立第二個例項
.
總共有8種寫法
.
第1種 餓漢式
不算完美, 但是比較實用, 所以比較推薦
一般程式設計師不太會去呼叫Class.forName(), 也就不會觸發new例項
.
第2種 餓漢式 - static程式碼塊 ( 跟第一種是一個意思 )
.
第3種 Lazy Loading 懶漢式 執行緒不安全
.
第4種 懶漢式 - 在getInstance方法上加synchronized關鍵字
執行緒安全, 但是會有長期的效能問題 ( 每次呼叫getInstance方法, 都會涉及加鎖操作 )
.
第5種 懶漢式 synchronized程式碼塊 執行緒不安全
解決了初始化完成之後, 效能下降的問題, 只有在初期, 程式碼才會進入synchronized
但是仍然有可能會有多個執行緒進入synchronized同步程式碼塊, 每次進去, 都會new一個例項, 所以也是有問題的
第6種 雙重判空 + synchronized 很多人認為的完美解法
最主要的缺點就是太複雜
第一個判空是有必要的, 可以阻止很多執行緒一上來就去獲取鎖, 這樣就又退回到前一個解法了
截圖中的instance漏加了volatile, 看吧 ! ! 多複雜 ! 容易寫錯 !
.
第7種 靜態內部類方式 ( 第一種完美解法)
在內部類裡給instance直接賦值, 靜態內部類必須是private的
載入外部類的時候, 不會載入內部類, 這樣就實現了懶載入
載入指的是Class.forName, 但由於程式設計師一般不會使用Class.forName, 所以更推薦第一種寫法
JVM能保證載入一個類, 只會載入一次, 所以只會new一次
第8種 列舉enum 完美中的完美(語法層面)
java創始人之一, 在Effective Java一書中的推薦
.
為什麼要在單例模式中防止反序列化?
前面7種解法, 都可以用反射的方式, 建立出第二個例項!!!
列舉類為什麼可以防止反射?
因為列舉類沒有構造方法, 即使用反射拿到class物件, 也沒法呼叫構造方法
但是也有缺點: 寫起來彆扭, 還是用class寫起來比較順, 定義成enum總感覺寫邏輯不太舒服
.
總結
在專案中最推薦用第一種寫法, 最簡單好記, 執行緒安全
首先程式設計師一般不會去呼叫Class.forName去載入它, 所以只是看上去像餓漢, 實際上卻和懶漢差不多
另外, 程式設計師更不會去用反射故意去new第二個物件, 這種故意搞破壞不在考慮範圍之內
第六種寫法太複雜, 要記得細節點特別多, 而且也沒法阻止反射的方法
第七種寫法相對簡單, 比第一種還是有些複雜, 而且也沒法阻止反射的方法
第八種寫法在語法上是完美的, 簡單, 執行緒安全, 防止反射, 就是寫起來彆扭
.
相關文章
- Singleton——單例模式(8種)單例模式
- 設計模式—singleton(單例模式)設計模式單例
- java設計模式-單例模式SingletonJava設計模式單例
- Singleton 單例設計模式單例設計模式
- PHP設計模式(四)單例模式(Singleton)PHP設計模式單例
- 《設計模式》 - 1. 單例模式( Singleton )設計模式單例
- 常用設計模式-單例模式(Singleton pattern)設計模式單例
- 設計模式之單例模式(Singleton Pattern)設計模式單例
- 設計模式--單例(Singleton Pattern)設計模式單例
- Scala 與設計模式(一):Singleton 單例模式設計模式單例
- PHP設計模式(一)—單例模式(Singleton Pattern)PHP設計模式單例
- 設計模式之“物件效能模式”: Singleton 單例模式(筆記)設計模式物件單例筆記
- 單例模式的五種寫法單例模式
- 單例模式的六種寫法單例模式
- 單例模式的七種寫法單例模式
- 單例模式(Singleton)單例模式
- 單例模式 singleton單例模式
- 單例模式(下)---聊一聊單例模式的幾種寫法單例模式
- 單例模式(下) - 聊一聊單例模式的幾種寫法單例模式
- 單例模式(下) – 聊一聊單例模式的幾種寫法單例模式
- Java:單例模式的七種寫法Java單例模式
- 單例模式有幾種寫法?單例模式
- 2.C#設計模式系列01_單例模式_SingletonC#設計模式單例
- Python單例模式(Singleton)的N種實現Python單例模式
- 單例模式(Singleton Pattern)單例模式
- 一天一個設計模式(二) - 單例模式(Singleton)設計模式單例
- 單例模式你會幾種寫法?單例模式
- laravel singleton 單例模式使用Laravel單例模式
- JAVA中實現單例(Singleton)模式的八種方式Java單例模式
- 設計模式(四)Singleton設計模式設計模式
- 淺談23種設計模式之單例設計模式設計模式單例
- Singleton設計模式設計模式
- Singleton(單例)——物件建立型模式單例物件模式
- [DELPHI]單例模式(singleton) 陳省單例模式
- 孔乙己的疑問:單例模式有幾種寫法單例模式
- 單例模式的七種寫法,你都知道嗎?單例模式
- java23種設計模式—— 二、單例模式Java設計模式單例
- 設計模式系列之單例模式(Singleton Pattern)——確保物件的唯一性設計模式單例物件