天天看點

設計模式—singleton(單例模式)

單例模式

單例設計模式屬于建立型模式,它提供了一種建立對象的最佳方式。這種模式涉及到一個單一的類,該類負責建立自己的對象,同時確定隻有單個對象被建立。

這個類提供了一種通路其唯一的對象的方式,可以直接通路,不需要執行個體化該類的對象。

應用執行個體

Windows是多程序多線程的,通過唯一的執行個體來操作一個檔案,避免地出現多個程序或線程同時操作一個檔案的現象。

一些裝置管理器常常設計為單例模式(如一個電腦有兩台列印機,在輸出的時候就要處理不能兩台列印機列印同一個檔案)。

使用場景

要求生産唯一序列号。

WEB 中的計數器,不用每次重新整理都在資料庫裡加一次,用單例先緩存起來。

建立的一個對象需要消耗的資源過多,比如 I/O 與資料庫的連接配接等。

單例實作

方式一

設計模式—singleton(單例模式)

方式二

改進了方式一的缺點,但同時帶來了線程安全問題

假設有兩個線程,線程1到第9行判斷完執行個體是否為空時(還沒到new一個執行個體),線程2也到了判斷執行個體是否為空的位置,

因為線程1還沒建立執行個體,INSTANCE仍為空,線程2建立完一個執行個體後,線程1繼續執行也建立了一個執行個體。

設計模式—singleton(單例模式)

方式三

通過synchronized加鎖,解決方式二的線程安全問題,但也帶來了效率下降。

通過加鎖,鎖定了Mgr03.class對象,是以輸出的hashcode是相同的。

設計模式—singleton(單例模式)

方式四

雙重校驗鎖,完美的單例模式寫法之一。

如果隻有外層判斷,就會出現線程安全問題(如同方式二)。

設計模式—singleton(單例模式)

方式五

靜态内部類方式,解決了方式一的問題,達到了按需初始化的目的,是完美的單例模式之一。

設計模式—singleton(單例模式)

方式六

通過枚舉實作單例

設計模式—singleton(單例模式)

枚舉方式 https://blog.csdn.net/moakun/article/details/80688851

繼續閱讀