《JAVA多線程編程核心技術》 筆記:第六章:單例模式與多線程
阿新 • • 發佈:2018-08-26
會有 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多線程編程核心技術》 筆記:第六章:單例模式與多線程