Maison > développement back-end > C++ > Le constructeur statique de C# est-il thread-safe pour les implémentations Singleton ?

Le constructeur statique de C# est-il thread-safe pour les implémentations Singleton ?

Mary-Kate Olsen
Libérer: 2025-01-16 11:31:59
original
242 Les gens l'ont consulté

Is C#'s Static Constructor Thread-Safe for Singleton Implementations?

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>
Copier après la connexion

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>
Copier après la connexion

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!

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal