精心整理了最新的面試資料和簡歷模板,有需要的可以自行獲取
點擊前往百度網盤獲取
點擊前往夸克網盤獲取
一、什么是單例模式?
單例模式(Singleton Pattern)是一種創建型設計模式,它保證一個類僅有一個實例,并提供一個全局訪問點。該模式常用于需要控制資源訪問的場景,如數據庫連接池、日志記錄器、配置管理對象等。
二、核心特性
- 私有化構造函數(防止外部實例化)
- 靜態私有成員變量(保存唯一實例)
- 靜態公有訪問方法(全局訪問入口)
三、6種經典實現方式
1. 餓漢式(線程安全)
public class EagerSingleton {private static final EagerSingleton instance = new EagerSingleton();private EagerSingleton() {}public static EagerSingleton getInstance() {return instance;}
}
- ? 優點:實現簡單,線程安全
- ? 缺點:類加載時立即初始化,可能造成資源浪費
2. 懶漢式(非線程安全)
public class LazySingleton {private static LazySingleton instance;private LazySingleton() {}public static LazySingleton getInstance() {if (instance == null) {instance = new LazySingleton();}return instance;}
}
- ? 優點:延遲初始化
- ? 缺點:多線程環境下可能創建多個實例
3. 線程安全懶漢式(同步方法)
public class SynchronizedSingleton {private static SynchronizedSingleton instance;private SynchronizedSingleton() {}public static synchronized SynchronizedSingleton getInstance() {if (instance == null) {instance = new SynchronizedSingleton();}return instance;}
}
- ? 優點:保證線程安全
- ? 缺點:同步鎖影響性能
4. 雙重檢查鎖定(Double-Check Locking)
public class DCLSingleton {private volatile static DCLSingleton instance;private DCLSingleton() {}public static DCLSingleton getInstance() {if (instance == null) {synchronized (DCLSingleton.class) {if (instance == null) {instance = new DCLSingleton();}}}return instance;}
}
- ? 優點:延遲加載且高效
- 🔑 關鍵點:
volatile
關鍵字防止指令重排序
5. 靜態內部類實現
public class InnerClassSingleton {private InnerClassSingleton() {}private static class Holder {static final InnerClassSingleton INSTANCE = new InnerClassSingleton();}public static InnerClassSingleton getInstance() {return Holder.INSTANCE;}
}
- ? 優點:線程安全且延遲加載
- 🌟 推薦:兼顧性能與安全性的優雅實現
6. 枚舉實現(Effective Java推薦)
public enum EnumSingleton {INSTANCE;public void doSomething() {// 業務方法}
}
- ? 優勢:
- 天生線程安全
- 防止反射攻擊
- 自動處理序列化/反序列化
- 🏆 被《Effective Java》列為最佳實現方式
四、應用場景
- 需要頻繁創建/銷毀的對象
- 重量級資源管理(數據庫連接池)
- 全局配置管理類
- 日志記錄器
- 設備驅動程序
五、潛在問題與解決方案
問題類型 | 解決方案 |
---|---|
反射攻擊 | 枚舉實現/構造器二次校驗 |
序列化破壞 | 實現readResolve() 方法 |
多類加載器 | 指定類加載器策略 |
多線程競爭 | 雙重檢查鎖定/內部類實現 |
六、總結
單例模式是Java中最常用的設計模式之一,不同實現方式各有優劣:
- 優先選擇枚舉實現(符合JDK規范)
- 需要延遲加載時推薦靜態內部類
- 舊版本JDK可考慮雙重檢查鎖定
正確使用單例模式可以優化系統資源使用,但需注意避免過度使用導致代碼耦合度增加。在實際開發中,建議結合具體需求和安全要求選擇最合適的實現方式。