單例模式確保一個類在整個應用程序中只有一個實例,並自行實例化、向全系統提供該實例。當多個實例會導致邏輯錯誤(如有序號碼生成器、配置管理器)時,必須使用單例模式。

<<...>> 為註釋信息+ public,- private,# protected,無修飾符為包可見單例模式三大核心要素:
| 模式 | 線程安全 | 調用效率 | 延時加載 | 特殊優勢 |
|---|---|---|---|---|
| 餓漢式 | 是 | 高 | 否 | 實現最簡單 |
| 懶漢式 | 是(同步鎖) | 較低 | 是 | 按需創建 |
| 靜態內部類 | 是 | 高 | 是 | 兼具效率與延時 |
| 枚舉單例 | 是 | 高 | 否 | 防反射/序列化破壞 |
public class SingletonTest01 {
private static SingletonTest01 instance = new SingletonTest01();
private SingletonTest01() {}
public static SingletonTest01 getInstance() {
return instance;
}
}
public class SingletonTest02 {
private static SingletonTest02 instance;
private SingletonTest02() {}
public static synchronized SingletonTest02 getInstance() {
if (instance == null) {
instance = new SingletonTest02();
}
return instance;
}
}
public class SingletonTest03 {
private SingletonTest03() {}
private static class Holder {
static final SingletonTest03 INSTANCE = new SingletonTest03();
}
public static SingletonTest03 getInstance() {
return Holder.INSTANCE;
}
}
public enum SingletonTest04 {
INSTANCE;
public void doSomething() {}
}
選型建議: 一般場景首選靜態內部類;極高安全要求(防反射、序列化攻擊)用枚舉;簡單工具類可用餓漢式。