Les constructeurs statiques C# sont-ils thread-safe ?
Considérez l'implémentation singleton suivante :
<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>
Cette implémentation est-elle thread-safe ?
Réponse :
Les constructeurs statiques (comme indiqué dans l'exemple) sont garantis pour être exécutés une seule fois dans le domaine d'application, avant la création d'une instance de la classe ou avant l'accès aux membres statiques (https://www.php .cn /link/362c6840e40a65edd557a108c219f8f0).
Ainsi, la construction initiale d'une instance singleton est thread-safe, ce qui signifie qu'elle ne nécessite pas de verrouillage ni de test nul. Cependant, cela ne garantit pas que l’objet singleton puisse être utilisé de manière synchrone.
Pour réaliser la synchronisation de toute utilisation d'une instance singleton, plusieurs méthodes peuvent être utilisées. Une méthode ressemble à ceci :
<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>
Cette implémentation introduit des mutex statiques pour synchroniser l'accès aux instances singleton. Pour assurer une bonne synchronisation, l'acquisition de chaque instance (Acquire()) doit être libérée (Release()).
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!