Pregunta

Tengo un Queston con respecto al bloqueo de doble verificación. Considere 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 externa IF, 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 entrará en el bloque sincronizado y en el primero no lo hará. ¿Por qué escucharía netbeans y eliminaría la declaración externa? Debería ser mejor evitar el bloqueo.

¿Fue útil?

Solución

El sistema automático de sugerencias de NetBeans obviamente no es consciente de que es posible hacer un bloqueo de doble verificación correctamente con volatile, como has hecho, por lo que sugiere un bloqueo completo. Más vale prevenir que lamentar. Pero tienes razón en este caso, no en NetBeans.

Otros consejos

La mayoría de las veces, el singleton se usará y no cuesta mucho crear, así que hazlo simple:

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

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

Si realmente quieres una instanciación perezosa, usa 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 escuches netbeans en esta situación. Su primera muestra de código es correcta.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top