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 サイトの他の関連記事を参照してください。