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

Побочные эффекты бросания исключения внутри синхронизированного предложения?

Есть ли какие-то неясные побочные эффекты для исключения исключения из синхронного предложения? Что происходит с замком?

private void doSomething() throws Exception {...}

synchronized (lock) {   
    doSomething();       
}
4b9b3361

Ответ 1

Я не вижу побочного эффекта.

Во всех случаях блокировка завершается, и исключение не является исключением (каламбур).

Ответ 2

Как вы могли бы надеяться, блокировка будет выпущена нормально.

Для справки соответствующий раздел JLS, который гарантирует это поведение, § 14.19:

Если выполнение Блока завершается нормально, блокировка разблокируется, и синхронизированный оператор завершается нормально. Если выполнение Блока завершается внезапно по какой-либо причине, блокировка разблокируется, и синхронизированный оператор завершается внезапно по той же причине.

( "крутое завершение" определено в другом месте JLS для включения исключений из JVM, исключений, вызванных throw, и использования операторов break, continue или return для передачи вне блока. )