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

Java 單例模式五種實作方式完整解析

     編輯:Java 綜合教學

Java 單例模式五種實作方式完整解析

單例模式確保類別在全域僅有一個實例,並提供全域存取點。常見應用:Spring 容器、資料庫連線池、快取管理、SessionFactory 等。本文詳細比較五種寫法的優缺點與適用場景。

核心要素

  1. 私有建構子:防止外部 new
  2. 靜態私有實例變數:儲存唯一實例
  3. 公開靜態取得方法:getInstance()
  4. 執行緒安全:多執行緒環境下仍保證唯一性

1. 餓漢式

public class Singleton {
    private static final Singleton INSTANCE = new Singleton();
    private Singleton() {}
    public static Singleton getInstance() { return INSTANCE; }
}
  • 優點:類別載入時即初始化,天然執行緒安全,呼叫效率最高
  • 缺點:若實例從未被使用,佔用記憶體;無法延遲載入

2. 懶漢式

基本版(非執行緒安全)

public class Singleton {
    private static Singleton instance;
    private Singleton() {}
    public static Singleton getInstance() {
        if (instance == null) instance = new Singleton();
        return instance;
    }
}
  • 缺點:多執行緒並發呼叫可能產生多個實例

同步鎖版

public static synchronized Singleton getInstance() {
    if (instance == null) instance = new Singleton();
    return instance;
}
  • 優點:執行緒安全
  • 缺點:每次呼叫皆加鎖,效能差

雙重檢查鎖

public static Singleton getInstance() {
    if (instance == null) {
        synchronized (Singleton.class) {
            if (instance == null) instance = new Singleton();
        }
    }
    return instance;
}
  • 優點:執行緒安全,僅首次初始化加鎖,效能佳
  • 注意:instance 需加 volatile 防止指令重排

3. 靜態內部類

public class Singleton {
    private Singleton() {}
    private static class Holder {
        private static final Singleton INSTANCE = new Singleton();
    }
    public static Singleton getInstance() { return Holder.INSTANCE; }
}
  • 優點:延遲載入、執行緒安全、無同步開銷、程式碼簡潔
  • 推薦程度:★★★★★

4. 列舉

public enum Singleton {
    INSTANCE;
    public void init() { System.out.println("資源初始化..."); }
}
  • 優點:天然執行緒安全、防止反射破解、防止序列化重新建立實例
  • Effective Java 作者 Joshua Bloch 強力推薦

比較總結表

方式延遲載入執行緒安全效能防反射推薦場景
餓漢式否是最高否輕量級、必定使用
懶漢式+同步是是低否不推薦
雙重檢查鎖是是高否需延遲載入且高併發
靜態內部類是是高否通用首選
列舉否是高是需防反射/序列化

優缺點總結

  • 優點:節省資源、提升頻繁建構/銷毀物件的效能、統一管理全域狀態
  • 缺點:隱藏建構子導致呼叫端不易發現、單元測試較難模擬、違反單一職責原則

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