單例模式
定義
單例模式(Singleton Pattern)是一種創(chuàng)建型設(shè)計(jì)模式,確保一個(gè)類只有一個(gè)實(shí)例,并提供一個(gè)全局訪問點(diǎn)。
核心特性
- 唯一性:保證一個(gè)類只有一個(gè)實(shí)例存在
- 全局訪問:提供全局訪問該實(shí)例的方法
- 延遲初始化:通常在第一次被請(qǐng)求時(shí)才創(chuàng)建實(shí)例(懶漢式)
實(shí)現(xiàn)方式
1. 餓漢式(線程安全)
public class Singleton { private static final Singleton instance = new Singleton(); private Singleton() {} public static Singleton getInstance() { return instance; } }
- 類加載時(shí)就初始化實(shí)例
- 線程安全但可能造成資源浪費(fèi)
2. 懶漢式(線程不安全)
public class Singleton { private static Singleton instance; private Singleton() {} public static Singleton getInstance() { if (instance == null) { instance = new Singleton(); } return instance; } }
- 延遲初始化
- 線程不安全
3. 線程安全懶漢式
public class Singleton { private static Singleton instance; private Singleton() {} public static synchronized Singleton getInstance() { if (instance == null) { instance = new Singleton(); } return instance; } }
- 方法加鎖保證線程安全
- 每次獲取實(shí)例都要同步,性能較低
4. 雙重檢查鎖(DCL)
public class Singleton { private volatile static Singleton instance; private Singleton() {} public static Singleton getInstance() { if (instance == null) { synchronized (Singleton.class) { if (instance == null) { instance = new Singleton(); } } } return instance; } }
- 減少同步塊的使用,提高性能
- 需要volatile防止指令重排序
5. 靜態(tài)內(nèi)部類
public class Singleton { private Singleton() {} private static class Holder { private static final Singleton INSTANCE = new Singleton(); } public static Singleton getInstance() { return Holder.INSTANCE; } }
- 線程安全
- 延遲加載
- 實(shí)現(xiàn)簡(jiǎn)單
6. 枚舉實(shí)現(xiàn)
public enum Singleton { INSTANCE; public void doSomething() { // ... } }
- 簡(jiǎn)潔
- 自動(dòng)支持序列化機(jī)制
- 絕對(duì)防止多次實(shí)例化
- 最安全的單例實(shí)現(xiàn)方式
應(yīng)用場(chǎng)景
- 需要頻繁創(chuàng)建和銷毀的對(duì)象
- 創(chuàng)建對(duì)象耗時(shí)或資源消耗大
- 工具類對(duì)象
- 訪問數(shù)據(jù)庫或文件的對(duì)象
- 需要共享訪問點(diǎn)或共享數(shù)據(jù)的場(chǎng)景
注意事項(xiàng)
- 多線程環(huán)境下的線程安全問題
- 序列化和反序列化可能破壞單例
- 反射攻擊可能破壞單例
- 單例模式可能增加代碼耦合度
- 單例對(duì)象生命周期長,可能成為內(nèi)存泄漏的來源
單例模式是設(shè)計(jì)模式中最簡(jiǎn)單的模式之一,但實(shí)現(xiàn)一個(gè)健壯的單例需要考慮多種因素,特別是在多線程環(huán)境下。