單例模式和有上限的多例模式
單例模式用一句話解釋就是一個類只能產生一個對象
我們都知道可以用一個new 關鍵字來產生一個對象,然后new的時候就會調用相應的構造函數
到這里我想如何控制類實例個數為1應該有了一點思路了
就是把構造函數設置為private,就可以阻止外部類創建對象了(這里不考慮利用反射機制去創建)
我們舉個例子順便給出代碼:
一個國家只有一個領導人,然后有許多的公民。我們任何時候見到的領導都是一個。相對應的類圖如下:
對應的代碼實現:
運行結果:
我是唯一的領導人
我是唯一的領導人
在給一個單例模式的通用類圖
代碼為:
這種形式的單例模式是線程安全的,這種模式也被稱為餓漢模式。
下面的是一種線程不安全的單例模式,也被稱為是懶漢模式:
現在就分析一下為什么這樣的寫法是線程不安全的
該單例模式在低並發條件下不會出現問題。但是一旦系統壓力過大,並發量增加就會出現一個內存中出現多個實例的情況
比如一個線程執行到 singleton = new Singleton(),但是因為對象的初始化需要時間,所以暫時singleton還是為空
剛好在這個時候另外一個線程執行了 singleton == null 的判斷,此刻是滿足條件的。所以就導致兩個線程都獲得了singleton對象,即在內存中出現了兩個對象
解決線程安全的方法第一種方法就是使用上面的餓漢模式去實現
第二種解決方法就是在getInstance方法前面加上synchronized關鍵字。這種模式也叫線程安全的懶漢模式。
具體實現如下:
第三種解決方法為:在getInstance方法內部加上synchronized關鍵字
具體實現如下:
最后一個要說的就是單例模式的一個擴展:有上限的多例模式
這樣的好處是我們可以決定內存中有多少個實例,可以修正單例模式帶來的性能問題。
UML圖如下:
具體代碼實現如下:
測試代碼:
運行結果:
到此單例模式以及擴展的有上限的多例模式講解結束。