1.什么是單例模式
單例模式(Singleton Pattern)是一種創建型設計模式,旨在確保一個類只有一個實例,并提供一個全局訪問點來訪問該實例。這種模式涉及到一個單一的類,該類負責創建自己的對象,同時確保只有單個對象被創建。
注意:
- 1、單例類只能有一個實例。
- 2、單例類必須自己創建自己的唯一實例。
- 3、單例類必須給所有其他對象提供這一實例
2.單例模式怎么實現
2.1 餓漢模式
餓漢模式 顧名思義 就是非常急切 所以它在類加載過程中就會生成實例?
同時 構造方法中也可根據需要進行傳參。
public class?Singleton {
private static?Singleton instance =?new?Singleton();
private?Singleton() {}
public static?Singleton getInstance() {
return?instance;
}
}
餓漢式在類加載時就創建實例,因此線程安全,但可能會浪費內存
2.2 懶漢模式
懶漢是 盡可能晚的去創建實例? 延遲創建
就比如看小說一樣是加載下一頁時候創建下一頁 而不是上來就全部加載 那樣太浪費空間
public class?Singleton {
private static?Singleton instance;
private?Singleton() {}
public static synchronized?Singleton getInstance() {
if?(instance ==?null) {
instance =?new?Singleton();
}
return?instance;
}
}
單例模式的創建不只有兩種模式 其他的不常用不過多涉及
3.單例模式下的線程安全
餓漢式在類加載時就創建實例,因此線程安全,但可能會浪費內存
懶漢式在需要時才創建實例,但需要加鎖以確保線程安全
由此看出我們懶漢模式是不安全 的
因此我們不難想到使用加鎖的方式來使得線程安全
但是如果每次運行都要加鎖那將大大降低運行效率
因此我們做一下優化
在單線程中 1 2 3還是1 3 2 都是無關緊要的 但是當在多線程中 這就會成為bug
因此我們可以借助volatile 來解決內存可見性問題
volatile 的功能有兩方面
1.確保每次讀取操作 都在讀內存
2.關于該變量的讀取 修改操作不會觸發重排序
4.單例模式的優缺點
優點:
-
內存節省:在內存中只有一個實例,減少了內存開銷。
-
資源管理:避免對資源的多重占用,如文件操作。
缺點:
-
不易擴展:沒有接口,不能繼承。
-
與單一職責原則沖突:一個類應該只關心內部邏輯,而不關心實例化方式。
5.使用場景
單例模式適用于以下場景:
-
唯一序列號生成。
-
全局計數器。
-
資源消耗大的對象,如數據庫連接。