初學者誤以為「類全是 static 方法就是單例」。實際上單例模式核心是全局唯一實例,static 只是手段之一。靜態方法可隨意調用、創建多個對象,無法約束實例數量。
private Singleton() {} 防止外部 newprivate static Singleton instance;public static Singleton getInstance()| 模式 | 線程安全 | 延遲加載 | 備註 |
|---|---|---|---|
| 餓漢式 | ✓ | ✗ | 類加載即創建,簡單可靠 |
| 懶漢式(同步鎖) | ✓ | ✓ | 性能差,不推薦 |
| 雙重檢查鎖(DCL) | ✓* | ✓ | 需 volatile 禁止指令重排 |
| 靜態內部類 | ✓ | ✓ | 推薦:利用類加載機制天然線程安全 |
| 枚舉單例 | ✓ | ✗ | 最簡潔,防反序列化破壞,Effective Java 推薦 |
public class Singleton {
private Singleton() {}
private static class Holder {
static final Singleton INSTANCE = new Singleton();
}
public static Singleton getInstance() {
return Holder.INSTANCE;
}
}