單例模式 屬於創建型模式。它確保某個類在 JVM 中只有一個實例存在,並提供一個全局訪問點 getInstance()。常用於資源管理器、線程池、緩存、配置類、數據庫連接池等場景。
public class Singleton {
private static final Singleton INSTANCE = new Singleton();
private Singleton() {} // 私有構造器
public static Singleton getInstance() { return INSTANCE; }
}
優點:實現簡單,無線程安全問題。
缺點:類加載即創建,若實例從未使用則浪費內存;無法處理構造器拋異常的情況。
public class Singleton {
private volatile static Singleton instance; // volatile 禁止指令重排
private Singleton() {}
public static Singleton getInstance() {
if (instance == null) { // 第一次檢查
synchronized (Singleton.class) {
if (instance == null) { // 第二次檢查
instance = new Singleton();
}
}
}
return instance;
}
}
優點:延遲加載,高併發下性能較好。
注意:volatile 關鍵字至關重要,防止指令重排導致其他線程看到半初始化對象。
public class Singleton {
private Singleton() {}
private static class Holder {
static final Singleton INSTANCE = new Singleton();
}
public static Singleton getInstance() { return Holder.INSTANCE; }
}
利用類加載機制保證線程安全,只有調用 getInstance() 時才會加載 Holder 類並創建實例。
public enum Singleton {
INSTANCE;
public void doSomething() { ... }
}
// 調用:Singleton.INSTANCE.doSomething();
if (INSTANCE != null) throw ... 防禦。Serializable 時需聲明 readResolve() 返回同一實例。一般情況首選 靜態內部類;要求極高安全性(防反射/序列化)選 枚舉;極簡場景可用 餓漢式。