public class Singleton {
private Singleton() {}
private static class Holder {
static final Singleton INSTANCE = new Singleton();
}
public static Singleton getInstance() { return Holder.INSTANCE; }
}
getInstance() 才觸發初始化 → **懶加載**;public enum Singleton {
INSTANCE;
public void doSomething() { /* 业务逻辑 */ }
}
newInstance() 直接拋異常;public class Singleton {
private volatile static Singleton instance;
private Singleton() {}
public static Singleton getInstance() {
if (instance == null) { // 第一次檢查 (無鎖)
synchronized (Singleton.class) { // 鎖定
if (instance == null) { // 第二次檢查
instance = new Singleton(); // 初始化
}
}
}
return instance;
}
}
public class Singleton {
public static final Singleton INSTANCE = new Singleton();
private Singleton() {}
}
| 維度 | 靜態內部類 | 枚舉 | DCL+volatile | 餓漢式 |
|---|---|---|---|---|
| 線程安全 | ✅ | ✅ | ✅ (需 volatile) | ✅ |
| 懶加載 | ✅ | ❌ | ✅ | ❌ |
| 防反射 | ❌ | ✅ | ❌ | ❌ |
| 防序列化 | ❌ (需 readResolve) | ✅ | ❌ (需 readResolve) | ❌ (需 readResolve) |
| 代碼複雜度 | 低 | 極低 | 中 | 極低 |
單例看似簡單,細節見真章。根據項目約束選擇最合適的那一款。