1.什么是單例
單例模式,是一種常用的軟件設計模式。在它的核心結構中只包含一個被稱為單例的特殊類。通過單例模式可以保證系統中一個類只有一個實例。即一個類只有一個對象實例
2.為什么需要單例
為了控制對象的唯一性。
對于系統中的某些類來說,只有一個實例很重要,例如,一個系統中可以存在多個打印任務,但是只能有一個正在工作的任務;一個系統只能有一個窗口管理器或文件系統;一個系統只能有一個計時工具或ID(序號)生成器。如在Windows中就只能打開一個任務管理器。如果不使用機制對窗口對象進行唯一化,將彈出多個窗口,如果這些窗口顯示的內容完全一致,則是重復對象,浪費內存資源;如果這些窗口顯示的內容不一致,則意味著在某一瞬間系統有多個狀態,與實際不符,也會給用戶帶來誤解,不知道哪一個才是真實的狀態。因此有時確保系統中某個對象的唯一性即一個類只能有一個實例非常重要
3.創建單例模式對象
餓漢模式(因為類屬性就是一個對象,而且跟隨著類加載同事創建。所以叫餓漢模式)
1.首先我們需要私有化構造函數
2.創建類的唯一實例,使用private static 修飾(為什么需要加private修改呢,因為如果沒有private ,外部就能通過類.屬性名的方式訪問,也就創建新的對象了)
3.提供一個用于獲取實例的方法,使用public static 修飾
那么也許會問為什么都需要static修改方法。
因為如果把構造函數私有化,就沒辦法
創建對象,接著也沒辦法使用非靜態方法獲得實例對象。
懶漢模式
懶漢模式和餓漢模式的區別
餓漢模式的特點是加載類時比較快,但是運行時獲取對象的速度比較快,線程安全
懶漢模式的特點時加載類時比較快,但運行時獲時取對象的速度比較慢,線程不安全
線程問題看這個博客(https://blog.csdn.net/sinat_32867867/article/details/53781512)
時間:2018.06.05? 補充,懶漢模式如何進行線程安全處理。
補充,上面的代碼不是線程安全 因為read是引用類型,需要加volatile 才算線程絕對安全