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

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

Mary-Kate Olsen
リリース: 2025-01-16 11:31:59
オリジナル
242 人が閲覧しました

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

C# の静的コンストラクターはスレッドセーフですか?

次のシングルトン実装を考えてみましょう:

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

    private Singleton() { }

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

    public static Singleton Instance
    {
        get { return instance; }
    }
}</code>
ログイン後にコピー

この実装はスレッドセーフですか?

答え:

静的コンストラクター (例に示すように) は、クラスのインスタンスが作成される前、または静的メンバーにアクセスする前に、アプリケーション ドメイン内で 1 回だけ実行されることが保証されています (https://www.php) .cn /link/362c6840e40a65edd557a108c219f8f0)。

したがって、シングルトン インスタンスの最初の構築はスレッドセーフです。つまり、ロックや null テストが必要ありません。ただし、これはシングルトン オブジェクトを同期的に使用できることを保証するものではありません。

シングルトン インスタンスの使用の同期を実現するには、いくつかの方法を使用できます。 1 つのメソッドは次のようになります:

<code class="language-csharp">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;
    }

    // 每次调用Acquire()都需要调用Release()
    public static void Release()
    {
        mutex.ReleaseMutex();
    }
}</code>
ログイン後にコピー

この実装では、シングルトン インスタンスへのアクセスを同期するための静的ミューテックスが導入されています。適切な同期を確保するには、各インスタンスの取得 (Acquire()) を解放する (Release()) 必要があります。

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

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート