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

Java 單例模式深度解析:從經典寫法到線程安全最佳實踐

     編輯:Java 相關知識

什麼是單例模式?

單例模式確保某個類在整個應用程式生命週期中只存在一個實例,並提供全域存取點。適用於資料庫連線池、配置管理器、日誌記錄器等「全域唯一」的場景。

最簡單的「餓漢式」實作

public class Singleton {
    // 類載入時即建立實例,天然線程安全
    private static final Singleton INSTANCE = new Singleton();

    private Singleton() { }  // 私有建構子,防止外部 new

    public static Singleton getInstance() {
        return INSTANCE;
    }
}

特點:

  • 實作最簡單,無同步開銷。
  • 類載入即初始化,若實例建構耗時或未被使用,會造成資源浪費。

進階:延遲初始化(懶漢式)與線程安全

雙重檢查鎖定

public class Singleton {
    private static volatile Singleton instance;  // volatile 禁止指令重排

    private Singleton() { }

    public static Singleton getInstance() {
        if (instance == null) {                  // 第一次檢查,避免不必要同步
            synchronized (Singleton.class) {
                if (instance == null) {          // 第二次檢查,確保單一建構
                    instance = new Singleton();
                }
            }
        }
        return instance;
    }
}

關鍵點:volatile 確保 instance = new Singleton() 的「分配記憶體 → 初始化物件 → 指向參考」三步驟不被重排,避免其他執行緒拿到半初始化的物件。

靜態內部類(推薦生產環境)

public class Singleton {
    private Singleton() { }

    private static class Holder {
        static final Singleton INSTANCE = new Singleton();
    }

    public static Singleton getInstance() {
        return Holder.INSTANCE;
    }
}

優勢:利用類載入機制天然保證線程安全,且延遲到首次呼叫 getInstance() 才初始化,碼簡潔、效能最佳。

枚舉單例:防反序列化破壞、防反射攻擊

public enum Singleton {
    INSTANCE;
    public void doSomething() { ... }
}

《Effective Java》作者 Joshua Bloch 強力推薦。枚舉序列化機制由 JVM 保證單一實例,且無法透過反射呼叫私有建構子。

單例模式三大核心要素總結

  1. 私有建構子:阻擋外部實例化。
  2. 私有靜態實例變數:持有唯一實例。
  3. 公開靜態取得方法:提供全域存取入口。

常見陷阱與對策

問題原因解決
反射破壞Constructor.setAccessible(true) 呼叫私有建構子建構子中拋出異常,或改用枚舉
反序列化產生新實例預設反序列化不經建構子實作 readResolve() 回傳既有實例,或用枚舉
多類載入器環境下出現多實例不同 ClassLoader 載入同一類視為不同類指定統一父類載入器,或採用模組化系統

結語

單例模式看似簡單,實則暗藏線程安全、序列化、反射等細節。生產環境首推靜態內部類或枚舉,兼顧延遲初始化、線程安全與防破壞,是經得起時間考驗的最佳實踐。

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