2015-07-29 3 views
0

Я новичок здесь и на Java. Я читал о параллелизме Java в учебнике Oracle Java, а именно в разделе «Объекты блокировки» Link to Page. Дело в том, что я не могу понять, почему блоки try и finally используются в методах impendingBow() и bow();Java пытается и, наконец, блокирует пример многопоточности

public boolean impendingBow(Friend bower) { 
    Boolean myLock = false; 
    Boolean yourLock = false; 
    try { 
     myLock = lock.tryLock(); 
     yourLock = bower.lock.tryLock(); 
    } finally { 
     if (! (myLock && yourLock)) { 
      if (myLock) { 
       lock.unlock(); 
      } 
      if (yourLock) { 
       bower.lock.unlock(); 
      } 
     } 
    } 
    return myLock && yourLock; 
} 
public void bow(Friend bower) { 
    if (impendingBow(bower)) { 
     try { 
      System.out.format("%s: %s has" 
       + " bowed to me!%n", 
       this.name, bower.getName()); 
      bower.bowBack(this); 
     } finally { 
      lock.unlock(); 
      bower.lock.unlock(); 
     } 
    } else { 
     System.out.format("%s: %s started" 
      + " to bow to me, but saw that" 
      + " I was already bowing to" 
      + " him.%n", 
      this.name, bower.getName()); 
    } 
} 

Будут ли эти два раздела кода работать без блоков try-finally? Будет ли функция tryLock() выдавать исключение, о котором я не знаю?

+0

Я предполагаю, что да, есть смысл, что 'tryLock()' может генерировать исключение. – CubeJockey

ответ

2

Это своего рода надуманный пример. Я думаю, что блоки try-finally используются здесь как попытка усилить практику освобождения замков в блоке finally.

Но это может быть полезно в некоторых редких случаях; возможно, может быть выброшена ошибка. Другой поток может вызвать любое исключение в текущем потоке с помощью Thread.stop(), или может произойти ошибка времени выполнения, например OutOfMemoryError.

В одном из этих случаев ошибок, однако, impendingBow() может выйти из удерживания обеих замков, и они не будут освобождены вызывающим абонентом, bow(). Таким образом, этот код не является образцовым. Это показывает полное соблюдение практики освобождения замков в finally, не продумав ничего.

+0

Это еще проще, чем это. System.out.format будет вызывать IllegalArgumentExceptions, если типы не совпадают с заполнителями. Вы не хотите, чтобы опечатка в коде отладки вызывала утечку блокировок. –

+0

Я не знал о практике освобождения замков. Это начинает иметь больше смысла. Спасибо. – BlaqICE

+0

@DavidEhrmann Здесь я подчеркиваю, что даже если код в блоках 'try' не содержит ошибок (как есть), существуют условия выполнения вне контроля программиста, которые могут генерировать исключения. Проблемы с типом в заявлении формата - ошибка, которая должна быть уловлена ​​модульным тестированием. – erickson