JavaNotes00-SingletonPattern(單例總結)
轉:http://hukai.me/java-notes-singleton-pattern/
這裡不贅述單例模式的概念了,直接演示幾種不同的實現方式。
0)Eager initialization
如果程式一開始就需要某個單例,並且建立這個單例並不那麼費時,我們可以考慮用這種方式:
1
2
3
4
5
6
7
8
9
|
|
這種實現方式有幾個特點:
- 例項一開始就被建立(Eager initialization)。
-
getInstance()
方法不需要加synchronize
來解決多執行緒同步的問題。 -
final
關鍵字確保了例項不可變,並且只會存在一個。
1)Lazy initialization
懶載入的方式使得單例會在第一次使用到時才會被建立.先看一種有隱患的寫法:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
|
請注意:上面的寫法其實非執行緒安全的,假設兩個Thread同時進入了getInstance方法,都判斷到instance==null,然後會因為synchronized的原因,逐個執行,這樣就得到了2個例項。解決這個問題,需要用到典型的double-check方式,如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
|
另外一個更簡略直觀的替代寫法是:
1
2
3
4
5
6
7
8
9
10
11
12
13
|
|
2)Static block initialization
如果我們對程式的載入順序有點了解的話,會知道Static block的初始化是執行在載入類之後,Constructor被執行之前。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
|
上面的寫法有一個弊端,如果我們類有若干個static的變數,程式的初始化卻只需要其中的1,2個的話,我們會做多餘的static initialization。
3)Bill Pugh solution
University of Maryland Computer Science researcher Bill Pugh有寫過一篇文章initialization on demand holder idiom。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
|
SingletonHolder類會在你需要的時候才會被初始化,而且它不影響Singleton類的其他static成員變數的使用。這個方法是執行緒安全的並且避免了使用volatile與synchronized。
4)Using Enum
這是最簡便安全的方法。沒有明顯的缺點,並且避免了下面要講到的序列化的隱患。
1
2
3
4
5
6
|
|
Serialize and de-serialize
在某些情況下,需要實現序列化的時候,普通的單例模式需要新增readResolve的方法,不然會出現異常。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
|
|
僅僅有上面的還不夠,我們需要新增serialVersionUID,例子詳見下面的總結。
Conclusion
實現一個功能完善,效能更佳,不存在序列化等問題的單例,建議使用下面兩個方式之一:
Bill Pugh(Inner Holder)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
|
Enum
1
2
3
4
5
6
|
|
參考資料
相關文章
- 單例模式總結單例模式
- 單例類的總結單例
- Java中單例設計模式總結Java單例設計模式
- 設計模式總結 —— 單例設計模式設計模式單例
- 美團一面:會單例模式嗎,寫個單例看看?(8大單例模式實現方式總結)單例模式
- Spring Boot之單元測試用例總結Spring Boot
- 工作深度總結——雙重鎖定實現單例單例
- Android之什麼場景該使用單例模式總結Android單例模式
- vuex簡單總結Vue
- MySQL簡單總結MySql
- express簡單總結Express
- 用到的設計模式總結--單例模式+工廠方法模式+Builder模式設計模式單例UI
- 揹包問題例題總結
- 設計用例的方法總結
- 列舉簡單總結
- sql注入簡單總結SQL
- Pygame的簡單總結GAM
- 外部表簡單總結
- Oracle profiles簡單總結Oracle
- 例項總結Oracle知識點大全Oracle
- SAP轉儲單全面總結
- js閉包簡單總結JS
- MLeakFinder使用總結及白名單
- 前端模組化簡單總結前端
- MVC-HtmlHelper簡單總結MVCHTML
- Django ORM的簡單總結DjangoORM
- 工作總結--工單排程
- GPU 渲染管線簡單總結(網上資料總結)GPU
- 資料結構簡單要點總結資料結構
- IOC容器的繫結解析過程(繫結單例)單例
- java多執行緒結合單例模式例項,簡單實用易理解Java執行緒單例模式
- JVM調優總結-典型配置舉例1JVM
- JVM調優總結-典型配置舉例2JVM
- linux下常用iptables配置例項總結Linux
- Java volatile關鍵字最全總結:原理剖析與例項講解(簡單易懂)Java
- HTTP/2 特性的簡單總結HTTP
- es6,async簡單總結
- Java基礎集合簡單總結Java