java - Verificación doble de bloqueo, NetBeans me confunde?
synchronization double-checked-locking (3)
El sistema de sugerencia automática de NetBeans obviamente no es consciente de que es posible hacer un doble control de bloqueo correctamente con volatile
, como ya hiciste, por lo que sugiere un bloqueo completo. Más vale prevenir que curar. Pero tienes razón en este caso, no NetBeans.
Tengo un queston con respecto al bloqueo doblemente verificado. Considera este ejemplo:
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 ;
}
}
Como he entendido, el código anterior es la forma correcta de hacer una clase Singleton.
Sin embargo, NetBeans quiere que elimine la declaración if externa, por lo que se vería así:
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 única diferencia entre estos dos fragmentos es que en el segundo ejemplo, el código siempre ingresará en el bloque sincronizado y en el primero no. ¿Por qué debería escuchar NetBeans y eliminar la declaración if externa? Debería ser mejor evitar el bloqueo.
La mayoría de las veces, se utilizará el singleton, y no cuesta mucho crearlo, así que simplemente hazlo simple:
public class Singleton {
private static final Singleton INSTANCE = new Singleton();
public static Singleton getInstance() {
return INSTANCE;
}
...
}
Si realmente quieres instanciación lenta, utiliza una clase interna estática:
public class Singleton {
public static Singleton getInstance() {
return Holder.INSTANCE;
}
...
private static class Holder {
private static final Singleton INSTANCE = new Singleton();
}
}
No escuche NetBeans en esta situación. Tu primer ejemplo de código es correcto.