Heim >Backend-Entwicklung >C++ >Ist ein C#-Singleton mit einem statischen Konstruktor threadsicher?
Singleton-Thread-Sicherheitsprobleme im statischen C#-Konstruktor
In diesem Artikel wird untersucht, ob mit statischen Konstruktoren implementierte C#-Singleton-Klassen threadsicher sind und wie sichergestellt werden kann, dass in einer Multithread-Umgebung nur eine Instanz vorhanden ist.
Erstbau
Statische Konstruktoren werden nur einmal in der Anwendungsdomäne ausgeführt, bevor die Klasse instanziiert wird oder auf die statischen Mitglieder zugegriffen wird. Daher ist die anfängliche Konstruktion einer Singleton-Instanz threadsicher.
Nachuntersuchung
Es ist jedoch wichtig sicherzustellen, dass der Zugriff nach der ersten Konstruktion threadsicher ist. Die bereitgestellte Implementierung ermöglicht mehreren Threads den gleichzeitigen Zugriff auf die Singleton-Instanz, was möglicherweise zu Problemen führt.
Synchronisationsmechanismus
Um dieses Problem zu lösen, kann die Implementierung mithilfe eines Synchronisierungsmechanismus erweitert werden. Eine Möglichkeit besteht darin, einen statischen Mutex wie diesen hinzuzufügen:
<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>
Anwendung
Um sicher auf eine Singleton-Instanz zuzugreifen, muss ein Thread zunächst einen Mutex mithilfe der Methode Acquire()
erwerben. Nach Abschluss entsperrt die Release()
-Methode den Mutex und ermöglicht anderen Threads den Zugriff auf die Instanz.
Fazit
Durch das Hinzufügen eines Synchronisierungsmechanismus wird die Singleton-Implementierung threadsicher und eliminiert potenzielle Parallelitätsprobleme.
Das obige ist der detaillierte Inhalt vonIst ein C#-Singleton mit einem statischen Konstruktor threadsicher?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!