單例(Singleton)模式的定義:指一個類隻有一個執行個體,且該類能自行建立這個執行個體的一種模式;這個類提供了一種通路其唯一的對象的方式,可以直接通路,不需要執行個體化該類的對象。
核心代碼:構造方法私有化,private。提供一個靜态的公開對外擷取執行個體的方法
單例模式有 3 個特點:
單例類隻有一個執行個體對象;
該單例對象必須由單例類自行建立;
單例類對外提供一個通路該單例的全局通路點。
單例模式的優點和缺點
單例模式的優點:
單例模式可以保證記憶體裡隻有一個執行個體,減少了記憶體的開銷。
可以避免對資源的多重占用。
單例模式設定全局通路點,可以優化和共享資源的通路。
單例模式的缺點:
單例模式一般沒有接口,擴充困難。如果要擴充,則除了修改原來的代碼,沒有第二種途徑,違背開閉原則。
在并發測試中,單例模式不利于代碼調試。在調試過程中,如果單例中的代碼沒有執行完,也不能模拟生成一個新的對象。
單例模式的功能代碼通常寫在一個類中,如果功能設計不合理,則很容易違背單一職責原則。
1.懶漢式
懶漢式,就是執行個體在用到的時候才去建立,比較懶,直到用到的時候才去檢查有沒有建立。有線程安全問題,如果剛開始有多個線程同時調用則會被建立多次。可以加上synchronized,所有又分成了線程安全和線程不安全兩種寫法
2.餓漢式
餓漢式,就是不管有沒有用到,啟動的時候先建立執行個體,比較勤奮,壞處就是浪費記憶體空間,好處就是沒有線程安全問題
3.雙檢鎖
雙檢鎖結合了懶漢式和餓漢式,在建立的時候保證線程安全,這樣又保證了線程安全,比直接上鎖提高了效率,又節省了空間
4.靜态内部類
靜态内部類,靜态初始化器,由JVM來保證線程安全 ,隻有被調用到時才會裝載,進而實作了延遲加載。
5.枚舉
枚舉自動支援序列化機制,絕對防止多次執行個體化。
在實際的應用場景中一般用到的懶漢式和雙檢鎖比較多