Sind statische C#-Konstruktoren threadsicher?
Betrachten Sie die folgende Singleton-Implementierung:
<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>
Ist diese Implementierung threadsicher?
Antwort:
Statische Konstruktoren (wie im Beispiel gezeigt) werden garantiert nur einmal in der Anwendungsdomäne ausgeführt, bevor eine Instanz der Klasse erstellt wird oder bevor auf die statischen Mitglieder zugegriffen wird (https://www.php .cn /link/362c6840e40a65edd557a108c219f8f0).
Daher ist die anfängliche Konstruktion einer Singleton-Instanz threadsicher, was bedeutet, dass keine Sperrung oder Nulltests erforderlich sind. Dies garantiert jedoch nicht, dass das Singleton-Objekt synchron verwendet werden kann.
Um eine Synchronisierung jeder Verwendung einer Singleton-Instanz zu erreichen, können mehrere Methoden verwendet werden. Eine Methode sieht so aus:
<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>
Diese Implementierung führt statische Mutexe ein, um den Zugriff auf Singleton-Instanzen zu synchronisieren. Um eine ordnungsgemäße Synchronisierung sicherzustellen, muss die Erfassung jeder Instanz (Acquire()) freigegeben werden (Release()).
Das obige ist der detaillierte Inhalt vonIst der statische Konstruktor von C# für Singleton-Implementierungen threadsicher?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!