Question

J'ai une question concernant le verrouillage revérifié. Prenons cet exemple:

public class Singleton {

     private static volatile Singleton instance = null;

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

Comme je l'ai compris, le code ci-dessus est la bonne façon de créer une classe Singleton.

Cependant, NetBeans veut que je supprime l'instruction if externe, donc cela ressemblerait à ceci:

public class Singleton {

     private static volatile Singleton instance = null;

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

La seule différence entre ces deux extraits est que dans le deuxième exemple, le code entrera toujours dans le bloc synchronisé et dans le premier il ne le sera pas.Pourquoi est-ce que j'écouterais NetBeans et supprimerais l'instruction if externe?Il vaut mieux éviter le verrouillage.

Était-ce utile?

La solution

Le système d'indication automatique de NetBeans ne sait évidemment pas qu'il est possible de faire un verrouillage double-vérifié correctement avec volatile, comme vous l'avez fait, il suggère donc un verrouillage complet à la place.Mieux vaut prévenir que guérir.Mais vous avez raison dans ce cas, pas NetBeans.

Autres conseils

La plupart du temps, le singleton sera utilisé et ne coûte pas cher à créer, alors faites-le simplement:

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

    public static Singleton getInstance() {
        return INSTANCE;
    }
    ...
}

Si vous voulez vraiment une instanciation paresseuse, utilisez une classe interne statique:

public class Singleton {
    public static Singleton getInstance() {
        return Holder.INSTANCE;
    }
    ...

    private static class Holder {
        private static final Singleton INSTANCE = new Singleton();
    }
}

N'écoutez pas NetBeans dans cette situation.Votre premier exemple de code est correct.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top