Le pattern Singleton avec la combinaison de chargement paresseux et le fil de sécurité

J'ai été faire quelques recherches sur les singletons, spécialement en ce qui concerne paresseux vs désireux d'initialisation de singletons.

Un exemple de désireux de l'initialisation:

public class Singleton
{
    //initialzed during class loading
    private static final Singleton INSTANCE = new Singleton();

    //to prevent creating another instance of Singleton
    private Singleton(){}

    public static Singleton getSingleton(){
        return INSTANCE;
    }
}

mais, comme indiqué ci-dessus qu'il est désireux d'initialisation et le fil de sécurité est laissée à la jvm
mais maintenant, je veux avoir ce même modèle, mais avec l'initialisation tardive.

donc je venir avec cette approche:

public final class Foo {
    private static class FooLoader {
        private static final Foo INSTANCE = new Foo();
    }
    private Foo() {
        if (FooLoader.INSTANCE != null) {
            throw new IllegalStateException("Already instantiated");
        }
    }
    public static Foo getInstance() {
        return FooLoader.INSTANCE;
    }
}

Comme indiqué ci-dessus Depuis la ligne de

private static final Foo INSTANCE = new Foo(); 

n'est exécuté que lorsque la classe FooLoader est effectivement utilisé, cela prend en charge les paresseux de l'instanciation, et il est garanti d'être thread-safe.

Est-ce correct?

  • En double stackoverflow.com/q/5842273/823393
  • Ce n'est pas vraiment l'initialisation tardive si? L'instance peut être chargé avant le getInstance méthode invoquée.
  • Ce n'est certainement paresseux. Le INSTANCE est instancié sur la référence première de la classe. Qui ne sera référencé dans la première invocation de getInstance. Mais je voudrais enlever la création de vérifier dans le constructeur.
  • dites-moi, qu'arriverait-il si je l'ai fait - Class.forName("Foo")?
  • il va créer la instace de la classe Foo. Que initialixation comprend les champs statiques et thr statique bloc. Il ne comprend pas statique classes enfant. vous pouvez essayer vous-même pour voir.
  • C'est le Titulaire du modèle.

InformationsquelleAutor tuntun fdg | 2013-04-03