Ответ 1
Я не вижу побочного эффекта.
Во всех случаях блокировка завершается, и исключение не является исключением (каламбур).
Есть ли какие-то неясные побочные эффекты для исключения исключения из синхронного предложения? Что происходит с замком?
private void doSomething() throws Exception {...}
synchronized (lock) {
doSomething();
}
Я не вижу побочного эффекта.
Во всех случаях блокировка завершается, и исключение не является исключением (каламбур).
Как вы могли бы надеяться, блокировка будет выпущена нормально.
Для справки соответствующий раздел JLS, который гарантирует это поведение, § 14.19:
Если выполнение Блока завершается нормально, блокировка разблокируется, и синхронизированный оператор завершается нормально. Если выполнение Блока завершается внезапно по какой-либо причине, блокировка разблокируется, и синхронизированный оператор завершается внезапно по той же причине.
( "крутое завершение" определено в другом месте JLS для включения исключений из JVM, исключений, вызванных throw
, и использования операторов break
, continue
или return
для передачи вне блока. )