Thread-Sicherheit des statischen C#-Konstruktors
In C# werden statische Konstruktoren nur einmal pro Anwendungsdomäne ausgeführt, bevor eine Klasseninstanz erstellt oder auf statische Mitglieder zugegriffen wird. Dadurch wird sichergestellt, dass sie bei der ersten Erstellung threadsicher sind, sodass bei der Erstellung von Singleton-Objekten keine Sperren und Nulltests erforderlich sind.
Die spätere Nutzung der Instanz erfolgt jedoch möglicherweise nicht synchron. Um dieses Problem zu lösen, sollten Sie erwägen, einen statischen Mutex hinzuzufügen, um den Zugriff auf die Instanz zu synchronisieren.
Das Folgende ist ein Beispiel für eine Thread-sichere Singleton-Implementierung, die eine Mutex-Sperre enthält:
<code class="language-c#">public class Singleton { private static Singleton instance; private static System.Threading.Mutex mutex = new System.Threading.Mutex(); // 初始化互斥锁 private Singleton() { } public static Singleton Instance { get { mutex.WaitOne(); try { if (instance == null) { instance = new Singleton(); } return instance; } finally { mutex.ReleaseMutex(); } } } }</code>
Diese Implementierung verwendet das Attribut Instance
, um den Zugriff auf die Singleton-Instanz zu synchronisieren und so einen threadsicheren Betrieb für alle nachfolgenden Nutzungsszenarien sicherzustellen. Durch die Verwendung eines get
-Blocks innerhalb eines try...finally
-Accessors stellen Sie sicher, dass der Mutex auch dann korrekt freigegeben wird, wenn eine Ausnahme auftritt. Dies ist sauberer und sicherer als die Methoden Acquire()
und Release()
im Originalbeispiel.
Das obige ist der detaillierte Inhalt vonWie kann die Thread-Sicherheit mit statischen C#-Konstruktoren und Singleton-Muster gewährleistet werden?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!