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

深入理解單例模式:從經典實現到線程安全的最佳實踐

     編輯:Java 程式設計入門

什麼是單例模式?

單例模式是創建型設計模式之一,確保某個類在整個應用程序生命週期中只存在一個實例,並提供一個全局訪問點獲取該實例。當系統需要一個獨一無二的對象來協調行為時,單例是首選方案。

典型應用場景

  • 線程池
  • 緩存管理器
  • 配置管理對象(偏好設置、注冊表)
  • 數據庫連接池
  • 日志記錄器
  • 驅動程序對象

類結構圖解

核心要素:private static 實例變量、private 構造函數、public static getInstance() 方法。

單例模式類圖

經典實現及其缺陷

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

問題:在多線程環境下,兩個線程可能同時通過 null 檢查,導致創建多個實例,違背單例初衷。

線程安全解決方案對比

1. 同步方法法

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

優點:實現簡單,線程安全。
缺點:每次調用都需加鎖,性能開銷大,僅首次創建需要同步。

2. 餓漢式

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

利用 JVM 類加載機制保證線程安全。適用於實例創建開銷小、確會被使用的場景。若實例極佔資源且可能不被用到,則不宜採用。

3. 雙重檢查鎖

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

關鍵點:

  • volatile 禁止指令重排序,確保其他線程看到完全初始化的對象
  • 第一次檢查避免不必要的同步開銷
  • 第二次檢查確保單例唯一性

這是高性能場景下的推薦寫法。

總結建議

  • 簡單應用、實例輕量 → 餓漢式
  • 高併發、延遲初始化需求 → 雙重檢查鎖
  • 極簡原型、教學演示 → 同步方法

掌握單例模式的演進邏輯,能幫助你在實際架構中做出最適合的技術決策。

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