1. ホーム
  2. c#

[解決済み】C#の静的コンストラクタはスレッドセーフか?

2022-04-05 14:23:18

質問

つまり、このSingletonの実装はスレッドセーフなのでしょうか。

public class Singleton
{
    private static Singleton instance;

    private Singleton() { }

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

    public static Singleton Instance
    {
        get { return instance; }
    }
}

解決方法は?

静的コンストラクタは、クラスのインスタンスが作成される前、あるいは静的メンバにアクセスする前に、アプリケーションドメインごとに一度だけ実行されることが保証されています。 https://docs.microsoft.com/en-us/dotnet/csharp/programming-guide/classes-and-structs/static-constructors

つまり、Singletonオブジェクトを構築する際にロックやNULLテストは必要ありません。しかし、これはインスタンスのすべての使用が同期化されることを意味するものではありません。これを実現する方法はいろいろありますが、以下にその一つを紹介します。

public class Singleton
{
    private static Singleton instance;
    // Added a static mutex for synchronising use of 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;
    }

    // Each call to Acquire() requires a call to Release()
    public static void Release()
    {
        mutex.ReleaseMutex();
    }
}