8 votes

J'ai vérifié deux fois le verrouillage, NetBeans me perturbe ?

J'ai une question concernant le verrouillage doublement vérifié. Prenons l'exemple suivant :

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 ;
    }
}

Si j'ai bien compris, le code ci-dessus est la manière correcte de créer une classe Singleton.

Cependant, NetBeans veut que je supprime l'instruction if extérieure, de sorte que cela ressemble à 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 second exemple, le code se retrouve toujours dans le bloc synchronisé, alors que dans le premier, il ne le fait pas. Pourquoi devrais-je écouter NetBeans et supprimer l'instruction if extérieure ? Il devrait être préférable d'éviter le verrouillage.

3voto

Joonas Pulakka Points 20361

Le système d'indication automatique de NetBeans ne sait manifestement pas qu'il est possible d'effectuer un verrouillage doublement 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.

3voto

JB Nizet Points 250258

La plupart du temps, le singleton sera utilisé, et sa création ne coûte pas grand-chose, 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();
    }
}

0voto

Artem Points 2001

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X