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

Lock.lock() перед тем, как попробовать

Есть ли разница между:

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(); до или после попытки?...

Спасибо за любую помощь

4b9b3361

Ответ 1

Если случай № 1, в finally вы можете просто сказать unlock(). В случае №2 вам нужно проверить, удерживаете ли вы замок до unlock(), иначе вы можете получить IllegalMonitorStateException

Ответ 2

Предполагая, что lock является ReentrantLock, тогда это не имеет никакого реального значения, поскольку lock() не выдает никаких проверенных исключений.

Документация по Java, однако, оставляет lock() вне блока try в примере ReentrantLock. Причиной этого является то, что неконтролируемое исключение в lock() не должно приводить к некорректному вызову unlock(). Является ли правильность проблемой при наличии неконтролируемого исключения в lock() всех вещей, это совсем другое обсуждение.

Это хорошая практика кодирования в целом, чтобы такие вещи, как try, были как можно более мелкие.

Ответ 3

Оператор try также содержит:

 } finally {
     lock.unlock();
 }

То есть, если вы поместите lock.lock() после try, исключения, вызванные lock.lock(), вызовут lock.unlock(), что неверно, поскольку блокировка не была получена, и разблокировка вызовет другое исключение. Итак, первый вариант правильный. Чтобы обрабатывать исключения, отбрасываемые lock.lock(), вам нужно использовать другой оператор try.

Ответ 4

В первом случае: если lock.lock() throws InterruptedException, getIn будет управлять им. Но для любого другого исключения он генерирует исключение, которое getIn не обрабатывает: Execution Execution

Во втором случае: кроме InterruptedException блок try-catch также выполняет некоторую обработку исключений, которую вы здесь не указали. Это должно исключать исключения, поскольку внутренний блок также фиксирует некоторые исключения.

Общий ход зависит от того, какие исключения lock.lock() выбрасывает?