單例模式
單例設計模式屬于建立型模式,它提供了一種建立對象的最佳方式。這種模式涉及到一個單一的類,該類負責建立自己的對象,同時確定隻有單個對象被建立。
這個類提供了一種通路其唯一的對象的方式,可以直接通路,不需要執行個體化該類的對象。
應用執行個體
Windows是多程序多線程的,通過唯一的執行個體來操作一個檔案,避免地出現多個程序或線程同時操作一個檔案的現象。
一些裝置管理器常常設計為單例模式(如一個電腦有兩台列印機,在輸出的時候就要處理不能兩台列印機列印同一個檔案)。
使用場景
要求生産唯一序列号。
WEB 中的計數器,不用每次重新整理都在資料庫裡加一次,用單例先緩存起來。
建立的一個對象需要消耗的資源過多,比如 I/O 與資料庫的連接配接等。
單例實作
方式一

方式二
改進了方式一的缺點,但同時帶來了線程安全問題
假設有兩個線程,線程1到第9行判斷完執行個體是否為空時(還沒到new一個執行個體),線程2也到了判斷執行個體是否為空的位置,
因為線程1還沒建立執行個體,INSTANCE仍為空,線程2建立完一個執行個體後,線程1繼續執行也建立了一個執行個體。
方式三
通過synchronized加鎖,解決方式二的線程安全問題,但也帶來了效率下降。
通過加鎖,鎖定了Mgr03.class對象,是以輸出的hashcode是相同的。
方式四
雙重校驗鎖,完美的單例模式寫法之一。
如果隻有外層判斷,就會出現線程安全問題(如同方式二)。
方式五
靜态内部類方式,解決了方式一的問題,達到了按需初始化的目的,是完美的單例模式之一。
方式六
通過枚舉實作單例
枚舉方式 https://blog.csdn.net/moakun/article/details/80688851