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

Java 單例模式:餓漢式與懶漢式深度對比

     編輯:Java 相關知識

兩種經典寫法

餓漢式 (類加載時創建)

public class EagerSingleton {
    private static final EagerSingleton INSTANCE = new EagerSingleton();
    private EagerSingleton() {}
    public static EagerSingleton getInstance() { return INSTANCE; }
}

懶漢式 (首次調用創建,線程安全)

public class LazySingleton {
    private static volatile LazySingleton instance;
    private LazySingleton() {}
    public static LazySingleton getInstance() {
        if (instance == null) {
            synchronized (LazySingleton.class) {
                if (instance == null) instance = new LazySingleton();
            }
        }
        return instance;
    }
}

對比維度

維度餓漢式懶漢式 (DCL)
初始化時機類加載首次 getInstance
線程安全天然安全需 volatile + 雙重檢查
性能獲取極快首次稍慢,後續同餓漢
資源佔用可能浪費(未用也創建)按需創建
異常處理構造拋異常導致類不可用可在構造捕獲/延遲處理

更優選擇:靜態內部類

public class HolderSingleton {
    private HolderSingleton() {}
    private static class Holder {
        static final HolderSingleton INSTANCE = new HolderSingleton();
    }
    public static HolderSingleton getInstance() { return Holder.INSTANCE; }
}

兼具延遲加載、線程安全、代碼簡潔,推薦作為默認單例實現。

枚舉單例 (Effective Java 推薦)

public enum EnumSingleton {
    INSTANCE;
    public void doSomething() {}
}

天然防反序列化破壞、防反射攻擊、線程安全,最簡潔健壯。

總結

  • 簡單場景、確實會用:餓漢式。
  • 資源重、可能不用:靜態內部類 或 枚舉。
  • 需延遲且構造複雜:DCL 懶漢式 (注意 volatile)。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved