Maison > Java > javaDidacticiel > Comprendre le modèle Singleton en Java

Comprendre le modèle Singleton en Java

Linda Hamilton
Libérer: 2025-01-24 02:25:08
original
458 Les gens l'ont consulté

Understanding the Singleton Pattern in 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.

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

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

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

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

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

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!

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