2012-06-03 5 views
12

Есть ли разница между: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(); до или после того, как попробовать ...

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

+1

Какой класс 'замок'? – Thor

+1

Что пойман? Если вы позже поймаете 'ExceptionThatLockCannotThrow' - между ними нет никакой разницы – amit

+0

Несколько человек до: private Lock lock; а затем lock = new ReentrantLock (true); спасибо ... операция разблокировки выполняется в конце; finally} lock.unlock(); – 9628001

ответ

0

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

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

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

+0

Метод ['lock()'] (http://download.java.net/jdk8/docs/api/java/util/concurrent/locks/ReentrantLock.html#lock--) не вызывает InterruptedExceptions.Блок в методе 'getIn' фактически является блоком' try-finally', а не 'try-catch'. –

9

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

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

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

4

Заявление попытки также содержит:

} finally { 
    lock.unlock(); 
} 

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

9

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