C# 静的コンストラクターにおけるシングルトン スレッドの安全性の問題
この記事では、静的コンストラクターを使用して実装された C# シングルトン クラスがスレッド セーフであるかどうか、およびマルチスレッド環境にインスタンスが 1 つだけ存在することを確認する方法について説明します。
初期構築
静的コンストラクターは、クラスがインスタンス化される前、または静的メンバーにアクセスされる前に、アプリケーション ドメインで 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()
メソッドはミューテックスのロックを解除し、他のスレッドがインスタンスにアクセスできるようにします。
結論
同期メカニズムを追加することにより、シングルトン実装はスレッドセーフになり、潜在的な同時実行の問題が排除されます。
以上が静的コンストラクターを使用した C# シングルトンはスレッドセーフですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。