1. 程式人生 > >《JAVA多線程編程核心技術》 筆記:第六章:單例模式與多線程

《JAVA多線程編程核心技術》 筆記:第六章:單例模式與多線程

會有 isp left sync con 多線程編程 鎖機制 數據 range

一、立即加載/"餓漢模式"和延遲加載/"懶漢模式"

立即加載(又稱餓漢模式):在使用類的時候已經將對象創建完畢,常見實現方法是直接new實例化

延遲加載(又稱懶漢模式):在調用get()方法時實例才被創建,常見實現方法是在get()方法中進行new實例化

二、懶漢模式在多線程下的缺點及解決

缺點:可能會出現多個實例的問題。

解決:

1、聲明synchronized關鍵字:

對get方法加上synchronized關鍵字即可保證同步運行,但效率太低。

2、嘗試同步代碼塊

這個方法本質和synchronized一樣,加鎖同步執行,還是效率太低

3、針對某些重要的代碼進行單獨的同步。

效率提高了,但是沒有解決問題,還是會有多個實例。

為什麽不同步?因為只是對處理邏輯做了同步,但是進入處理邏輯的判斷沒有同步處理,還是會有問題的。

4、使用DCL雙檢查鎖機制(大多數通用的機制)

即在第三種方式的基礎上,在同步方法內,額外再做一次判斷,判斷通過執行相應代碼,失敗不執行。

三、單例模式的其他實現

3.1 使用靜態內置類實現單例模式

這個和餓漢模式感覺沒區別...不過不同的是:餓漢模式實在類初始化時直接創建,而靜態內置類實在靜態內部類被調用時實現。只是改變了實現的時間點,本質沒什麽區別。

靜態內置類可以實現線程安全,但是如果遇到序列化對象時,使用默認方式運行得到的結果還是多例的。

3.2 序列化與反序列化的單例模式實現

靜態內置類可以實現線程安全,但是如果遇到序列化對象時,使用默認方式運行得到的結果還是多例的。解決方法是:自己定義readResolve方法?

3.3 使用static代碼塊實現單例模式

這個和餓漢模式感覺沒區別..只是一個是static對象,一個是static代碼塊

3.4使用enum枚舉數據類型實現單例模式

枚舉enum和靜態代碼塊的特性相似,使用枚舉類時,構造方法會被自動調用。

這種方式好像暴露了一些問題,在下一種方式中修復,具體是什麽問題,其實我不理解...不理解什麽單一原則呀..等

END

《JAVA多線程編程核心技術》 筆記:第六章:單例模式與多線程