Ответ 1
Если случай № 1, в finally
вы можете просто сказать unlock()
. В случае №2 вам нужно проверить, удерживаете ли вы замок до unlock()
, иначе вы можете получить IllegalMonitorStateException
Есть ли разница между:
private Lock lock = new ReentrantLock(true);
public void getIn (int direction) throws InterruptedException {
lock.lock();
try {
...
и
...
public void getIn (int direction) throws InterruptedException {
try {
lock.lock();
...
Компиляция идет гладко, а также работает программа (я имею в виду тот же вывод)
Должен ли я поставить lock.lock(); до или после попытки?...
Спасибо за любую помощь
Если случай № 1, в finally
вы можете просто сказать unlock()
. В случае №2 вам нужно проверить, удерживаете ли вы замок до unlock()
, иначе вы можете получить IllegalMonitorStateException
Предполагая, что lock
является ReentrantLock
, тогда это не имеет никакого реального значения, поскольку lock()
не выдает никаких проверенных исключений.
Документация по Java, однако, оставляет lock()
вне блока try
в примере ReentrantLock
. Причиной этого является то, что неконтролируемое исключение в lock()
не должно приводить к некорректному вызову unlock()
. Является ли правильность проблемой при наличии неконтролируемого исключения в lock()
всех вещей, это совсем другое обсуждение.
Это хорошая практика кодирования в целом, чтобы такие вещи, как try
, были как можно более мелкие.
Оператор try также содержит:
} finally {
lock.unlock();
}
То есть, если вы поместите lock.lock()
после try
, исключения, вызванные lock.lock()
, вызовут
lock.unlock()
, что неверно, поскольку блокировка не была получена, и разблокировка вызовет другое исключение. Итак, первый вариант правильный. Чтобы обрабатывать исключения, отбрасываемые lock.lock()
, вам нужно использовать другой оператор try.
В первом случае: если lock.lock()
throws InterruptedException
, getIn
будет управлять им. Но для любого другого исключения он генерирует исключение, которое getIn
не обрабатывает: Execution Execution
Во втором случае: кроме InterruptedException
блок try-catch
также выполняет некоторую обработку исключений, которую вы здесь не указали. Это должно исключать исключения, поскольку внутренний блок также фиксирует некоторые исключения.
Общий ход зависит от того, какие исключения lock.lock()
выбрасывает?