Maison > développement back-end > C++ > Le constructeur statique de C# est-il suffisant pour l'implémentation de Singleton Thread-Safe ?

Le constructeur statique de C# est-il suffisant pour l'implémentation de Singleton Thread-Safe ?

Patricia Arquette
Libérer: 2025-01-16 11:36:58
original
143 Les gens l'ont consulté

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

Sécurité des threads du constructeur statique C# en mode singleton

Le modèle singleton est un modèle de conception courant dans le développement de logiciels, garantissant qu'une classe n'a qu'une seule instance dans le domaine d'application. En C#, un constructeur statique est chargé d'initialiser les membres statiques d'une classe, y compris les instances dans une implémentation singleton.

Question :

L'implémentation singleton C# suivante est-elle thread-safe ?

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

Réponse :

Oui, le constructeur statique de cette implémentation garantit la sécurité des threads lors de la construction initiale de l'instance singleton. Selon la documentation Microsoft, les constructeurs statiques en C# sont garantis de s'exécuter une seule fois dans chaque domaine d'application avant la création d'une instance de la classe ou l'accès aux membres statiques.

Cependant, il est important de noter que cette sécurité des threads ne s'applique qu'à la construction initiale de l'instance. Cela ne garantit pas que l’utilisation ultérieure de l’instance sera synchronisée. Pour garantir une sécurité totale des threads, des mécanismes de synchronisation supplémentaires sont requis.

Une façon d'obtenir la synchronisation des threads consiste à introduire un mutex statique pour contrôler l'accès à l'instance singleton :

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

Cette implémentation nécessite que chaque appel à Acquire() soit associé à un appel à Release(), garantissant qu'un seul thread peut accéder à l'instance singleton à la fois. En adoptant cette approche, la sécurité des threads est obtenue non seulement lors de la construction initiale, mais également lors de l'utilisation ultérieure de l'instance.

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