Domanda

Ho un problema riguardo al blocco a doppio controllo. Considera questo esempio:

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

Come ho capito, il codice sopra è il modo corretto per fare una classe singleton.

Tuttavia, Netbeans vuole che rimuova l'istruzione esterna se, quindi sembrerebbe così:

public class Singleton {

     private static volatile Singleton instance = null;

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

L'unica differenza tra questi due frammenti è che nel secondo esempio, il codice entrerà sempre nel blocco sincronizzato e nel primo non lo farà. Perché dovrei ascoltare NetBeans e rimuovere l'istruzione If esterna? Dovrebbe essere meglio evitare il blocco.

È stato utile?

Soluzione

Il sistema di suggerimenti automatici di NetBeans ovviamente non è consapevole del fatto che è possibile eseguire correttamente il blocco a doppio controllo volatile, come hai fatto, quindi suggerisce invece il blocco completo. Meglio prevenire che curare. Ma hai ragione in questo caso, non Netbeans.

Altri suggerimenti

Il più delle volte, il singleton verrà utilizzato e non costa molto da creare, quindi rendilo semplice:

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

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

Se vuoi davvero un'istanza pigra, usa una classe interna statica:

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

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

Non ascoltare Netbeans in questa situazione. Il tuo primo campione di codice è corretto.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top