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

C# 單例模式最佳實踐 (3):Double-Check Locking 執行緒安全完整實作

     編輯:關於C語言

執行緒安全單例 (Double-Check Locking)

using System;
public sealed class Singleton
{
    private static volatile Singleton instance;
    private static readonly object syncRoot = new Object();

    private Singleton() { }

    public static Singleton Instance
    {
        get
        {
            if (instance == null)
            {
                lock (syncRoot)
                {
                    if (instance == null)
                        instance = new Singleton();
                }
            }
            return instance;
        }
    }
}

關鍵設計解析

  • volatile:確保寫入完成前其他執行緒不可見,防止指令重排導致半初始化實例。
  • syncRoot 專用鎖定物件:避免鎖定 typeof(Singleton) 引發死鎖風險。
  • 雙重檢查:首次檢查避免不必要鎖定開銷;鎖內再檢查確保單一建立。
  • CLR 保證:.NET 執行環境修正了 Java 早期 DCL 的記憶體模型缺陷,此寫法在 .NET 上正確。

優缺點總結

優點缺點
靜態初始化由 CLR 保證時機;DCL 在 CLR 正確運作需顯式處理多執行緒初始化競爭
延遲實例化,首次存取才建立大多數情況靜態初始化已足夠

實務建議:單純單例優先用 static readonly 欄位或 Lazy<T>;極少數需精確控制初始化時機才用 DCL。

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