Verrouillage vérifié, NetBeans me confond?
-
29-10-2019 - |
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.
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.