Maison  >  Article  >  développement back-end  >  Solution de sécurité des threads du mode singleton dans un environnement concurrent

Solution de sécurité des threads du mode singleton dans un environnement concurrent

WBOY
WBOYoriginal
2023-10-15 12:06:26829parcourir

Solution de sécurité des threads du mode singleton dans un environnement concurrent

Solution de sécurité des threads du mode singleton dans un environnement concurrent

Dans le processus de développement logiciel, le mode singleton est largement utilisé dans les scénarios où il est nécessaire de s'assurer qu'il n'y a qu'une seule instance d'une certaine classe. Cependant, dans un environnement concurrent, le modèle singleton peut entraîner des problèmes de sécurité des threads. Cet article présentera quelques solutions courantes pour garantir la sécurité des threads du modèle singleton dans un environnement concurrent et fournira des exemples de code correspondants.

1. Verrouillage à double vérification

Le verrouillage à double vérification signifie que la classe singleton est instanciée lorsqu'elle est utilisée pour la première fois. Cette méthode peut éviter de créer une instance singleton au démarrage de l'application, améliorant ainsi les performances de l'application. Cependant, dans un environnement multithread, la paresse peut entraîner des problèmes lorsque plusieurs threads entrent simultanément dans le bloc de code d'instanciation.

Pour résoudre ce problème, vous pouvez utiliser le mécanisme de verrouillage à double vérification, c'est-à-dire le verrouillage à double vérification. Avant d'instancier le bloc de code, utilisez le mot-clé synchronisé pour synchroniser les méthodes statiques de la classe afin de garantir qu'un seul thread peut entrer dans le bloc de code d'instanciation. De plus, une deuxième vérification est effectuée dans le bloc de code synchronisé pour garantir qu'aucun autre thread n'a créé d'instance en attendant le verrou.

Ce qui suit est un exemple de code d'une classe singleton utilisant un mécanisme de verrouillage paresseux et revérifié :

public class Singleton {
    private static volatile Singleton instance;

    private Singleton() {
    }

    public static Singleton getInstance() {
        if (instance == null) {
            synchronized (Singleton.class) {
                if (instance == null) {
                    instance = new Singleton();
                }
            }
        }
        return instance;
    }
}

Dans le code ci-dessus, la variable d'instance déclarée comme volatile est utilisée pour assurer la visibilité de la variable sur tous les threads. Le mécanisme de verrouillage à double vérification garantit qu'un seul thread peut entrer dans le bloc de code d'instanciation, résolvant ainsi le problème de sécurité des threads des personnes paresseuses dans des environnements concurrents.

2. Style chinois affamé

Le style chinois affamé signifie implémenter le modèle singleton en créant une instance lorsque la classe est initialisée. Cette méthode est thread-safe dans un environnement multithread, car lorsque la classe est initialisée, la JVM garantira qu'un seul thread peut initialiser la classe.

Ce qui suit est un exemple de code d'une classe singleton utilisant le style Hungry :

public class Singleton {
    private static final Singleton instance = new Singleton();

    private Singleton() {
    }

    public static Singleton getInstance() {
        return instance;
    }
}

Dans le code ci-dessus, la variable d'instance est déclarée comme finale, garantissant qu'elle ne peut être attribuée qu'une seule fois. En initialisant l'instance dans un bloc de code statique, vous pouvez vous assurer que l'instance singleton est créée lors du chargement de la classe.

3. Classes statiques internes

Les classes statiques internes font référence au retardement de la création d'une instance singleton jusqu'à la première utilisation de l'instance, tout en utilisant le mécanisme de chargement de classe pour garantir la sécurité des threads. Cette méthode permet non seulement un chargement paresseux, mais garantit également la sécurité des threads.

Ce qui suit est un exemple de code pour une classe singleton utilisant une classe statique interne :

public class Singleton {
    private static class SingletonHolder {
        private static final Singleton instance = new Singleton();
    }

    private Singleton() {
    }

    public static Singleton getInstance() {
        return SingletonHolder.instance;
    }
}

Dans le code ci-dessus, la classe SingletonHolder est déclarée comme privée et ne sera chargée que lorsque la classe est référencée dans la méthode getInstance du Singleton classe. Étant donné que le chargeur de classe est thread-safe pendant le processus de chargement de la classe, la sécurité des threads de SingletonHolder peut être garantie.

Résumé :

Cet article présente la solution de sécurité des threads du mode singleton dans un environnement concurrent et fournit des exemples de code correspondants. Le style paresseux évite le problème de l'entrée simultanée de plusieurs threads dans le bloc de code d'instanciation grâce au mécanisme de verrouillage à double vérification. Le style affamé garantit la sécurité des threads grâce à l'initialisation de la classe, et la classe statique interne combine le chargement paresseux et la sécurité des threads. En fonction des besoins réels et des scénarios d'utilisation, le choix d'une solution de sécurité des threads appropriée peut améliorer l'efficacité et la stabilité du mode singleton dans un environnement concurrent.

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!

Déclaration:
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