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

Java 設計模式:單例模式五種寫法演進與線程安全深度分析

     編輯:Java 相關知識

前言

在軟體開發中,某些物件全系統只需一個實例(如線程池、快取、配置物件)。單例模式確保類只有一個實例,並提供全域訪問點。

1. 懶漢式(基礎版)

public class Singleton {
    private static Singleton singleInstance;
    private Singleton() {}
    public static Singleton getInstance() {
        if (singleInstance == null) {
            singleInstance = new Singleton();
        }
        return singleInstance;
    }
}

優點:延遲載入,用到才建立。
缺點:線程不安全,多線程並發時可能建立多個實例。

2. 懶漢式(同步方法)

public static synchronized Singleton getInstance() {
    if (singleInstance == null) {
        singleInstance = new Singleton();
    }
    return singleInstance;
}

優點:線程安全。
缺點:效率低,每次獲取都要同步,實例建立後其實不需要鎖。

3. 餓漢式(靜態初始化)

public class Singleton {
    private static Singleton instance = new Singleton();
    private Singleton() {}
    public static Singleton getInstance() { return instance; }
}

優點:JVM 類載入機制天然保證線程安全,調用效率高。
缺點:無延遲載入,類載入即建立,可能造成資源浪費;類較大時拖慢啟動。

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 禁止指令重排序,確保構造完成前不可見
  • 第一次檢查避免不必要同步,第二次檢查確保單例
  • 僅 Java 5+ 有效,舊版本記憶體模型不保證

5. 靜態內部類(推薦現代開發)

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

優點:

  • 利用 JVM 類載入機制保證線程安全
  • 真正實現延遲載入(只有呼叫 getInstance() 才載入 Holder 類)
  • 程式碼簡潔,無鎖效能損耗

類載入器陷阱

若系統存在多個 ClassLoader,同一個類可能被載入多次,導致多個單例實例。解決:指定統一的類載入器載入單例類。

總結建議

寫法線程安全延遲載入效能推薦度
懶漢式基礎版❌✅高❌
同步方法✅✅低❌
餓漢式✅❌高一般
雙重檢查鎖✅✅高✅ 推薦
靜態內部類✅✅高✅ 最推薦
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved