В java возвращаемое значение в синхронизированном блоке кажется плохим. Это действительно имеет значение?
У меня есть Collections.synchronizedList of WeakReference, _components;
Я написал что-то вроде следующего, ожидая, что нарушитель будет жаловаться:
public boolean addComponent2(Component e) {
synchronized (_components) {
return _components.add(new WeakReference<Component>(e));
}
}
Но компилятор полностью удовлетворен. Обратите внимание, что List.add() возвращает TRUE. Так нормально, любой выход из синхронизированного блока освобождает блокировку, но разве этот LOOK не странный? Это похоже на "дыру" в блоке, аналогичную использованию возврата в цикле.
Вы были бы счастливы поддерживать такой код?
Ответы
Ответ 1
Это абсолютно нормально - как возвращается из цикла или из блока try
, который имеет соответствующий блок finally
. Вам просто нужно знать семантику, и в этот момент это имеет смысл.
Это, безусловно, более простой код, чем введение в него локальной переменной:
// Ick - method body is now more complicated, with no benefit
public boolean addComponent2(Component e) {
boolean ret;
synchronized (_components) {
ret = _components.add(new WeakReference<Component>(e));
}
return ret;
}
Ответ 2
Нет ничего плохого в возврате внутри блока synchronized
. Блокировка будет отпущена правильно.