Thread-Sicherheit des statischen C#-Konstruktors im Singleton-Modus
Das Singleton-Muster ist ein gängiges Entwurfsmuster in der Softwareentwicklung, das sicherstellt, dass eine Klasse nur eine Instanz in der Anwendungsdomäne hat. In C# ist ein statischer Konstruktor für die Initialisierung der statischen Mitglieder einer Klasse verantwortlich, einschließlich Instanzen in einer Singleton-Implementierung.
Frage:
Ist die folgende C#-Singleton-Implementierung threadsicher?
<code class="language-C#">public class Singleton { private static Singleton instance; private Singleton() { } static Singleton() { instance = new Singleton(); } public static Singleton Instance { get { return instance; } } }</code>
Antwort:
Ja, der statische Konstruktor in dieser Implementierung garantiert Thread-Sicherheit während der ersten Konstruktion der Singleton-Instanz. Laut Microsoft-Dokumentation werden statische Konstruktoren in C# garantiert nur einmal in jeder Anwendungsdomäne ausgeführt, bevor eine Instanz der Klasse erstellt wird oder auf statische Mitglieder zugegriffen wird.
Es ist jedoch wichtig zu beachten, dass diese Thread-Sicherheit nur für die anfängliche Erstellung der Instanz gilt. Es ist nicht gewährleistet, dass die spätere Nutzung der Instanz synchronisiert wird. Um vollständige Thread-Sicherheit zu gewährleisten, sind zusätzliche Synchronisationsmechanismen erforderlich.
Eine Möglichkeit, eine Thread-Synchronisierung zu erreichen, besteht darin, einen statischen Mutex einzuführen, um den Zugriff auf die Singleton-Instanz zu steuern:
<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>
Diese Implementierung erfordert, dass jeder Aufruf von Acquire() mit einem Aufruf von Release() gepaart wird, um sicherzustellen, dass jeweils nur ein Thread auf die Singleton-Instanz zugreifen kann. Durch diesen Ansatz wird Thread-Sicherheit nicht nur während der anfänglichen Konstruktion, sondern auch während der späteren Verwendung der Instanz erreicht.
Das obige ist der detaillierte Inhalt vonReicht der statische Konstruktor von C# für die Thread-sichere Singleton-Implementierung aus?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!