精心整理了最新的面試資料和簡歷模板,有需要的可以自行獲取
點擊前往百度網盤獲取
點擊前往夸克網盤獲取
一、什么是單例模式?
單例模式(Singleton Pattern)是一種創建型設計模式,確保一個類只有一個實例,并提供全局訪問點。其核心價值在于:
- 避免重復創建對象,節省系統資源
- 保證全局狀態一致性
- 控制共享資源的訪問
二、經典實現方式
1. 餓漢式(Eager Initialization)
public class EagerSingleton {// 類加載時立即初始化private static final EagerSingleton instance = new EagerSingleton();// 私有構造方法private EagerSingleton() {}public static EagerSingleton getInstance() {return instance;}
}
特點:
- 線程安全
- 可能造成資源浪費(未使用即加載)
2. 懶漢式(Lazy Initialization)
public class LazySingleton {private static LazySingleton instance;private LazySingleton() {}public static synchronized LazySingleton getInstance() {if (instance == null) {instance = new LazySingleton();}return instance;}
}
特點:
- 延遲加載
- 同步鎖影響性能
3. 雙重校驗鎖(Double-Checked Locking)
public class DCLSingleton {private static volatile DCLSingleton instance;private DCLSingleton() {}public static DCLSingleton getInstance() {if (instance == null) {synchronized (DCLSingleton.class) {if (instance == null) {instance = new DCLSingleton();}}}return instance;}
}
關鍵點:
volatile
防止指令重排序- 減少同步代碼塊范圍
4. 靜態內部類(Holder Pattern)
public class HolderSingleton {private HolderSingleton() {}private static class Holder {private static final HolderSingleton INSTANCE = new HolderSingleton();}public static HolderSingleton getInstance() {return Holder.INSTANCE;}
}
優勢:
- 天然線程安全
- 延遲加載
- 無同步性能損耗
5. 枚舉實現(Effective Java推薦)
public enum EnumSingleton {INSTANCE;public void doSomething() {// 業務方法}
}
優點:
- 絕對防止反射攻擊
- 自動處理序列化
- 代碼最簡潔
三、單例模式的應用場景
- 配置管理器
- 數據庫連接池
- 日志記錄器
- 線程池管理
- 緩存系統
四、潛在問題與解決方案
問題類型 | 解決方案 |
---|---|
反射攻擊 | 私有構造器添加實例存在檢查 |
序列化破壞 | 實現readResolve()方法 |
多類加載器 | 指定類加載器 |
多線程環境 | 選擇合適的線程安全實現方案 |
五、最佳實踐建議
- 優先選擇枚舉或靜態內部類實現
- 謹慎使用synchronized關鍵字
- 考慮依賴注入框架(如Spring)管理單例
- 避免在分布式系統中濫用單例
- 單元測試時注意單例狀態重置
六、單例模式 vs 靜態類
特性 | 單例模式 | 靜態類 |
---|---|---|
接口實現 | 支持 | 不支持 |
延遲加載 | 可實現 | 不可實現 |
繼承機制 | 支持 | 不支持 |
內存管理 | 可被GC回收 | 常駐內存 |
總結:單例模式是Java開發中應用最廣泛的設計模式之一,但需要根據具體場景選擇合適的實現方式。現代開發中,建議優先考慮枚舉實現或結合IoC容器管理對象生命周期,在保證功能性的同時提高代碼的可維護性。