Дважды проверил блокировку, NetBeans меня смущает? - PullRequest
8 голосов
/ 07 декабря 2011

У меня есть квест, связанный с двойной проверкой блокировки. Рассмотрим этот пример:

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? Лучше избегать блокировки.

Ответы [ 3 ]

3 голосов
/ 07 декабря 2011

Автоматическая система подсказок NetBeans, очевидно, не знает, что можно правильно выполнить двойную проверку блокировки с volatile, как вы сделали, поэтому вместо нее предлагается полная блокировка.Береженого Бог бережет.Но в этом случае вы правы, а не NetBeans.

3 голосов
/ 07 декабря 2011

Большую часть времени будет использоваться синглтон, и его создание будет стоить недорого, поэтому просто упростите его:

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

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

Если вы действительно хотите ленивую реализацию, используйте статический внутренний класс:

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

    private static class Holder {
        private static final Singleton INSTANCE = new Singleton();
    }
}
0 голосов
/ 07 декабря 2011

Не слушайте NetBeans в этой ситуации.Ваш первый пример кода правильный.

...