У меня есть квест, связанный с двойной проверкой блокировки.
Рассмотрим этот пример:
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? Лучше избегать блокировки.