Problèmes de sécurité des threads singleton dans le constructeur statique C#
Cet article explore si les classes singleton C# implémentées à l'aide de constructeurs statiques sont thread-safe et comment garantir qu'une seule instance existe dans un environnement multithread.
Construction initiale
Les constructeurs statiques ne sont exécutés qu'une seule fois dans le domaine d'application, avant l'instanciation de la classe ou l'accès aux membres statiques. Par conséquent, la construction initiale d’une instance singleton est thread-safe.
Visite de suivi
Cependant, il est essentiel de garantir que l'accès après la construction initiale est thread-safe. L'implémentation fournie permet à plusieurs threads d'accéder simultanément à l'instance singleton, ce qui peut causer des problèmes.
Mécanisme de synchronisation
Pour résoudre ce problème, la mise en œuvre peut être améliorée à l'aide d'un mécanisme de synchronisation. Une solution consiste à ajouter un mutex statique comme celui-ci :
<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>
Comment utiliser
Afin d'accéder en toute sécurité à une instance singleton, un thread doit d'abord acquérir un mutex à l'aide de la méthode Acquire()
. Une fois terminée, la méthode Release()
déverrouillera le mutex, permettant à d'autres threads d'accéder à l'instance.
Conclusion
En ajoutant un mécanisme de synchronisation, l'implémentation singleton devient thread-safe, éliminant ainsi les problèmes potentiels de concurrence.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!