Подтвердить что ты не робот

В java возвращаемое значение в синхронизированном блоке кажется плохим. Это действительно имеет значение?

У меня есть Collections.synchronizedList of WeakReference, _components;

Я написал что-то вроде следующего, ожидая, что нарушитель будет жаловаться:

public boolean addComponent2(Component e) {
    synchronized (_components) {
        return _components.add(new WeakReference<Component>(e));
    }        
}

Но компилятор полностью удовлетворен. Обратите внимание, что List.add() возвращает TRUE. Так нормально, любой выход из синхронизированного блока освобождает блокировку, но разве этот LOOK не странный? Это похоже на "дыру" в блоке, аналогичную использованию возврата в цикле.

Вы были бы счастливы поддерживать такой код?

4b9b3361

Ответ 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. Блокировка будет отпущена правильно.