public class EagerSingleton {
private static final EagerSingleton INSTANCE = new EagerSingleton();
private EagerSingleton() {}
public static EagerSingleton getInstance() { return INSTANCE; }
}
public class LazySingleton {
private static volatile LazySingleton instance;
private LazySingleton() {}
public static LazySingleton getInstance() {
if (instance == null) {
synchronized (LazySingleton.class) {
if (instance == null) instance = new LazySingleton();
}
}
return instance;
}
}
| 維度 | 餓漢式 | 懶漢式 (DCL) |
|---|---|---|
| 初始化時機 | 類加載 | 首次 getInstance |
| 線程安全 | 天然安全 | 需 volatile + 雙重檢查 |
| 性能 | 獲取極快 | 首次稍慢,後續同餓漢 |
| 資源佔用 | 可能浪費(未用也創建) | 按需創建 |
| 異常處理 | 構造拋異常導致類不可用 | 可在構造捕獲/延遲處理 |
public class HolderSingleton {
private HolderSingleton() {}
private static class Holder {
static final HolderSingleton INSTANCE = new HolderSingleton();
}
public static HolderSingleton getInstance() { return Holder.INSTANCE; }
}
兼具延遲加載、線程安全、代碼簡潔,推薦作為默認單例實現。
public enum EnumSingleton {
INSTANCE;
public void doSomething() {}
}
天然防反序列化破壞、防反射攻擊、線程安全,最簡潔健壯。