В Java возвращаемое значение в синхронизированном блоке кажется плохим стилем. Это действительно имеет значение?
У меня есть Collections.synchronizedList WeakReference, _components;
Я написал что-то вроде следующего, ожидая, что компилятор пожалуется:
public boolean addComponent2(Component e) {
synchronized (_components) {
return _components.add(new WeakReference<Component>(e));
}
}
Но компилятор вполне устраивает. Обратите внимание, что List.add() возвращает TRUE. Итак, любой выход из синхронизированного блока снимает блокировку, но не выглядит ли это странно? Это похоже на "дыру" в блоке, похожую на использование return в цикле.
Будете ли вы счастливы, поддерживая такой код?
2 ответа
Это абсолютно нормально - как возвращается из цикла или из 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;
}
Нет ничего плохого в том, чтобы вернуться внутрь synchronized
блок. Замок будет снят правильно.