Блокировка с двойной проверкой, NetBeans меня путает?

У меня вопрос по поводу блокировки с двойной проверкой. Рассмотрим такой пример:

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

Как я понял, приведенный выше код является правильным способом создания класса Singleton.

Однако NetBeans хочет, чтобы я удалил внешний оператор if, так что это будет выглядеть так:

public class Singleton {

     private static volatile Singleton instance = null;

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

Единственное различие между этими двумя фрагментами заключается в том, что во втором примере код всегда попадает в синхронизированный блок, а в первом - нет. Зачем мне слушать NetBeans и удалять внешний оператор if? Лучше избежать блокировки.

8
задан Rox 7 December 2011 в 09:33
поделиться