ホームページ >バックエンド開発 >C++ >C# の静的コンストラクターはスレッドセーフなシングルトン実装に十分ですか?

C# の静的コンストラクターはスレッドセーフなシングルトン実装に十分ですか?

Patricia Arquette
Patricia Arquetteオリジナル
2025-01-16 11:36:58149ブラウズ

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

シングルトン モードでの C# 静的コンストラクターのスレッド セーフ

シングルトン パターンはソフトウェア開発における一般的な設計パターンであり、アプリケーション ドメイン内でクラスのインスタンスが 1 つだけであることを保証します。 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# の静的コンストラクターは、クラスのインスタンスが作成される前、または静的メンバーにアクセスされる前に、各アプリケーション ドメインで 1 回だけ実行されることが保証されています。

ただし、このスレッド セーフはインスタンスの初期構築にのみ適用されることに注意することが重要です。その後のインスタンスの使用が同期されることは保証されません。スレッドの完全な安全性を確保するには、追加の同期メカニズムが必要です。

スレッド同期を実現する 1 つの方法は、静的ミューテックスを導入してシングルトン インスタンスへのアクセスを制御することです。

<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() の呼び出しと組み合わせる必要があり、一度に 1 つのスレッドのみがシングルトン インスタンスにアクセスできるようにします。このアプローチを採用することで、最初の構築中だけでなく、その後のインスタンスの使用中にもスレッドの安全性が実現されます。

以上がC# の静的コンストラクターはスレッドセーフなシングルトン実装に十分ですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。