言い換えれば、このシングルトン実装はスレッドセーフですか?
public class Singleton
{
private static Singleton instance;
private Singleton() { }
static Singleton()
{
instance = new Singleton();
}
public static Singleton Instance
{
get { return instance; }
}
}
ベストアンサー1
静的コンストラクターは、クラスのインスタンスが作成されるか、静的メンバーがアクセスされる前に、アプリケーション ドメインごとに 1 回だけ実行されることが保証されています。https ://learn.microsoft.com/en-us/dotnet/csharp/programming-guide/classes-and-structs/static-constructors
示されている実装は、最初の構築ではスレッド セーフです。つまり、シングルトン オブジェクトの構築にはロックや null テストは必要ありません。ただし、これはインスタンスの使用が同期されることを意味するものではありません。これを行うにはさまざまな方法があります。以下に 1 つを示します。
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();
}
}