首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 綜合教學

設計模式深度剖析:單例模式演進與最佳實踐

     編輯:Java 綜合教學

一、核心概念

單例模式確保整個應用程序中只有一個實例,即對象只能被 new 一次。

二、懶漢模式演進

1. 非線程安全

public class Singleton {
    private static Singleton singleton;
    public static Singleton getSingleton() {
        if (singleton == null) singleton = new Singleton();
        return singleton;
    }
}

高併發下可能創建多實例。

2. 同步鎖版本

public synchronized static Singleton getSingleton() {
    if (singleton == null) singleton = new Singleton();
    return singleton;
}

線程安全但性能低,實例化後每次調用仍需同步。

3. 雙重檢查鎖 (DCL)

public static Singleton getSingleton() {
    if (singleton == null) {
        synchronized (Singleton.class) {
            if (singleton == null) singleton = new Singleton();
        }
    }
    return singleton;
}

減少同步開銷,但指令重排可能導致返回未初始化對象。

4. 加 volatile 修復 DCL

private volatile static Singleton singleton;

volatile 禁止指令重排,保證初始化可見性,實現高性能線程安全。

三、餓漢模式

public class Singleton {
    private static Singleton singleton = new Singleton();
    public static Singleton getSingleton() { return singleton; }
}

類加載時即創建,天然線程安全,但無延遲加載能力。

四、靜態內部類模式(推薦)

public class Singleton {
    static class SingletonManager {
        private final static Singleton SINGLETON = new Singleton();
        public final static Singleton getSingleton() { return SINGLETON; }
    }
    public static Singleton getInstance() { return SingletonManager.getSingleton(); }
}

結合延遲加載(首次調用才初始化內部類)與線程安全(類加載機制保證),無鎖高性能。

五、適用場景

共享資源管理:數據庫連接池、線程池、配置管理器、日志對象等。

六、單例 vs 靜態類

維度單例靜態類
繼承/多態支持不可繼承,無多態
延遲加載支持編譯期初始化,不支持
單元測試易於 Mock難以 Mock,靜態方法不可覆寫
性能略低(首次調用開銷)極高(無實例化開銷)

純工具方法可用靜態類;需狀態、繼承、測試選單例。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved