Чтобы разблокировать Lock, рекомендуется вызвать метод unlock() из выражения finally:
lock.lock();
try{
  // critical section which may throw exceptions
} finally {
  lock.unlock();
}
Это делается для того, чтобы избежать возможного взаимоблокировки, если исключение выбрано из кода в критическом разделе.
Почему та же практика не рекомендуется для двоичных семафоров в эквивалентных сценариях?
mutex.acquire();
try{
  // critical section which may throw exceptions
} finally {
  mutex.release();
}
