Maison >Java >javaDidacticiel >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.
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.
<code class="language-java">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(); } }</code>
2. Thread-Safe Singleton : utilise synchronized
pour garantir la sécurité des threads lors de la création de l'instance.
<code class="language-java">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(); } }</code>
3. Verrouillage à double vérification : optimise la sécurité des threads en minimisant la surcharge de synchronisation.
<code class="language-java">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(); } }</code>
4. Bill Pugh Singleton (recommandé) : Utilise une classe interne statique pour garantir une initialisation paresseuse et la sécurité des threads.
<code class="language-java">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(); } }</code>
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.
<code class="language-java">public enum EnumSingleton { INSTANCE; public void showMessage() { System.out.println("Hello from Enum Singleton!"); } }</code>
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!