Comprendre le modèle Singleton en Java
Le modèle Java Singleton est un modèle de conception largement utilisé qui garantit qu'une classe n'a qu'une seule instance et lui fournit un point d'accès global. Considérez-le comme un seul manager supervisant une équipe : il n'y en a qu'un, et tout le monde interagit via ce point de contact unique. Cet article détaillera l'implémentation du modèle et les différentes approches en Java.
Pourquoi utiliser le modèle Singleton ?
- Instance unique garantie : garantit qu'une seule instance d'une classe existe dans votre application. Ceci est crucial pour gérer les ressources telles que les connexions aux bases de données (en évitant la création et la destruction excessives de connexions) ou les spouleurs d'imprimante (en évitant les conflits entre les utilisateurs).
- Point d'accès global : Fournit un point d'accès unique et facilement disponible à l'instance.
- Gestion des ressources : Gère efficacement les ressources partagées telles que les configurations, les systèmes de journalisation ou les pools de threads.
Comment implémenter le modèle Singleton en Java
Plusieurs approches existent, chacune avec ses propres compromis :
1. Initialisation paresseuse : Crée l'instance uniquement lorsqu'elle est nécessaire pour la première fois.
import java.io.Serializable; public class LazySingleton implements Serializable { private static LazySingleton instance; private LazySingleton() { if (instance != null) { throw new IllegalStateException("Instance already created"); } } public static LazySingleton getInstance() { if (instance == null) { instance = new LazySingleton(); } return instance; } private Object readResolve() { return getInstance(); } }
2. Thread-Safe Singleton : utilise synchronized
pour garantir la sécurité des threads lors de la création de l'instance.
import java.io.*; public class ThreadSafeSingleton implements Serializable { private static final long serialVersionUID = 1L; private static ThreadSafeSingleton instance; private ThreadSafeSingleton() { if (instance != null) { throw new IllegalStateException("Instance already created"); } } public static synchronized ThreadSafeSingleton getInstance() { if (instance == null) { instance = new ThreadSafeSingleton(); } return instance; } private Object readResolve() { return getInstance(); } }
3. Verrouillage à double vérification : optimise la sécurité des threads en minimisant la surcharge de synchronisation.
import java.io.*; public class DoubleCheckedLockingSingleton implements Serializable { private static final long serialVersionUID = 1L; private static volatile DoubleCheckedLockingSingleton instance; private DoubleCheckedLockingSingleton() { if (instance != null) { throw new IllegalStateException("Instance already created"); } } public static DoubleCheckedLockingSingleton getInstance() { if (instance == null) { synchronized (DoubleCheckedLockingSingleton.class) { if (instance == null) { instance = new DoubleCheckedLockingSingleton(); } } } return instance; } private Object readResolve() { return getInstance(); } }
4. Bill Pugh Singleton (recommandé) : Utilise une classe interne statique pour garantir une initialisation paresseuse et la sécurité des threads.
import java.io.*; public class BillPughSingleton implements Serializable { private static final long serialVersionUID = 1L; private BillPughSingleton() { if (SingletonHelper.INSTANCE != null) { throw new IllegalStateException("Instance already created"); } } private static class SingletonHelper { private static final BillPughSingleton INSTANCE = new BillPughSingleton(); } public static BillPughSingleton getInstance() { return SingletonHelper.INSTANCE; } private Object readResolve() { return getInstance(); } }
5. Enum Singleton (approche moderne) : exploite la sécurité inhérente aux threads et la gestion de la sérialisation des énumérations. Cette approche est souvent considérée comme la meilleure pour sa simplicité et sa robustesse.
public enum EnumSingleton { INSTANCE; public void showMessage() { System.out.println("Hello from Enum Singleton!"); } }
Résumé des implémentations Singleton
- Initialisation paresseuse : Simple, mais nécessite une gestion supplémentaire pour la sécurité des threads et la sérialisation.
- Thread-Safe Singleton : Thread-safe, mais peut entraîner une surcharge de performances en raison de la synchronisation.
- Verrouillage à double vérification : Améliore les performances par rapport à l'approche de base thread-safe.
- Bill Pugh Singleton : Élégant et efficace, souvent préféré pour sa simplicité et la sécurité des fils.
- Enum Singleton : La solution la plus concise et la plus robuste, tirant parti des fonctionnalités intégrées de Java. Généralement recommandé pour le développement Java moderne.
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!

Outils d'IA chauds

Undresser.AI Undress
Application basée sur l'IA pour créer des photos de nu réalistes

AI Clothes Remover
Outil d'IA en ligne pour supprimer les vêtements des photos.

Undress AI Tool
Images de déshabillage gratuites

Clothoff.io
Dissolvant de vêtements AI

Video Face Swap
Échangez les visages dans n'importe quelle vidéo sans effort grâce à notre outil d'échange de visage AI entièrement gratuit !

Article chaud

Outils chauds

Bloc-notes++7.3.1
Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise
Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1
Puissant environnement de développement intégré PHP

Dreamweaver CS6
Outils de développement Web visuel

SublimeText3 version Mac
Logiciel d'édition de code au niveau de Dieu (SublimeText3)

Sujets chauds











Dépannage et solutions au logiciel de sécurité de l'entreprise qui fait que certaines applications ne fonctionnent pas correctement. De nombreuses entreprises déploieront des logiciels de sécurité afin d'assurer la sécurité des réseaux internes. ...

Solutions pour convertir les noms en nombres pour implémenter le tri dans de nombreux scénarios d'applications, les utilisateurs peuvent avoir besoin de trier en groupe, en particulier en un ...

Le traitement de la cartographie des champs dans l'amarrage du système rencontre souvent un problème difficile lors de l'exécution d'amarrage du système: comment cartographier efficacement les champs d'interface du système a ...

Commencez le printemps à l'aide de la version IntelliJideaultimate ...

Lorsque vous utilisez MyBatis-Plus ou d'autres cadres ORM pour les opérations de base de données, il est souvent nécessaire de construire des conditions de requête en fonction du nom d'attribut de la classe d'entité. Si vous manuellement à chaque fois ...

Conversion des objets et des tableaux Java: Discussion approfondie des risques et des méthodes correctes de la conversion de type de distribution De nombreux débutants Java rencontreront la conversion d'un objet en un tableau ...

Explication détaillée de la conception des tables SKU et SPU sur les plates-formes de commerce électronique Cet article discutera des problèmes de conception de la base de données de SKU et SPU dans les plateformes de commerce électronique, en particulier comment gérer les ventes définies par l'utilisateur ...

Comment la solution de mise en cache Redis réalise-t-elle les exigences de la liste de classement des produits? Pendant le processus de développement, nous devons souvent faire face aux exigences des classements, comme l'affichage d'un ...
