首頁 >後端開發 >C++ >C# 的靜態建構子足以實現線程安全的單例嗎?

C# 的靜態建構子足以實現線程安全的單例嗎?

Patricia Arquette
Patricia Arquette原創
2025-01-16 11:36:58146瀏覽

Is C#'s Static Constructor Sufficient for Thread-Safe Singleton Implementation?

C# 靜態建構子在單例模式中的執行緒安全性

單例模式是軟體開發中常見的設計模式,確保一個類別在應用程式領域中只有一個實例。在 C# 中,靜態建構子負責初始化類別的靜態成員,包括單例實作中的實例。

問題:

以下 C# 單例實作是否執行緒安全?

<code class="language-C#">public class Singleton
{
    private static Singleton instance;

    private Singleton() { }

    static Singleton()
    {
        instance = new Singleton();
    }

    public static Singleton Instance
    {
        get { return instance; }
    }
}</code>

答案:

是的,此實作中的靜態建構函式保證了在單例實例的初始建構期間的執行緒安全性。根據 Microsoft 文檔,C# 中的靜態建構函式保證只在建立類別的任何實例或存取靜態成員之前在每個應用程式網域中執行一次。

但是,需要注意的是,這種執行緒安全性僅適用於實例的初始建構。它不保證實例的後續使用將被同步。為了確保完全的線程安全性,需要額外的同步機制。

一種實作執行緒同步的方法是引入一個靜態互斥鎖來控制對單例實例的存取:

<code class="language-C#">public class Singleton
{
    private static Singleton instance;
    private static System.Threading.Mutex mutex;

    private Singleton() { }

    static Singleton()
    {
        instance = new Singleton();
        mutex = new System.Threading.Mutex();
    }

    public static Singleton Acquire()
    {
        mutex.WaitOne();
        return instance;
    }

    public static void Release()
    {
        mutex.ReleaseMutex();
    }
}</code>

此實作要求每個對 Acquire() 的呼叫都與對 Release() 的呼叫配對,確保一次只有一個執行緒可以存取單例實例。透過採用這種方法,不僅在初始建構期間,而且在實例的後續使用期間都能實現執行緒安全性。

以上是C# 的靜態建構子足以實現線程安全的單例嗎?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn