8種單例模式以及優缺點

8種單例模式以及優缺點

名 稱 核心代碼 優點 缺點 結論 源碼舉例
餓漢式(靜態常量) 在這裏插入圖片描述 1、簡單 2、 在類裝載的時候完成實例化,避免了線程同步問題 1、初始化就加載,如果從始至終沒有用過這個實例,造成內存浪費 可用 java.lang.Runtime
餓漢式(靜態代碼塊) 在這裏插入圖片描述 同上 同上 可用
懶漢式(線程不安全) 在這裏插入圖片描述 有了懶加載效果,但是隻能單線程使用 如果在多線程下,一個線程進入了 if (singleton == null)判斷語句塊,還未來得及往下執行,另一個線程也通過了這個判斷語句,這時便會產生多個實例 單線程可用
懶漢式(線程安全,同步方法) 在這裏插入圖片描述 解決了線程安全問題 效率太低了,每個線程在想獲得類的實例時候,執行 getInstance()方法都要進行同步。而其實這個方法只執行一次實例化代碼就夠了,後面的想獲得該類實例,直接 return 就行了。方法進行同步效率太低 不推薦使用
懶漢式(線程安全,同步代碼塊) 在這裏插入圖片描述 多線程可能出現多個實例 不推薦使用
雙重檢查 在這裏插入圖片描述 保證了懶加載 線程安全 效率高 推進使用
靜態內部類(效率高) 在這裏插入圖片描述 採用了類裝載機制確保了線程安全問題,靜態內部類在實例初始化不會加載,達到了懶加載效果,靜態屬性只在實例第一次加載時初始化一次,保證了只會有一個實例 推進使用
枚舉 在這裏插入圖片描述 藉助jdk 加載枚舉的特點實現單例模式,不僅避免了線程問題,還能防止通過反序列化創建新的對象實例 推進使用

單例模式使用注意事項

  1. 單例模式保證了 系統內存中該類只存在一個對象,節省了系統資源,對於一些需要頻繁創建銷燬的對象,使用單例模式可以提高系統性能
  2. 當想實例化一個單例類的時候,必須要記住使用相應的獲取對象的方法,而不是使用 new
  3. 單例模式使用的場景:需要頻繁的進行創建和銷燬的對象、創建對象時耗時過多或耗費資源過多(即:重量級對象),但又經常用到的對象、工具類對象、頻繁訪問數據庫或文件的對象(比如數據源、session工廠等)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章