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

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

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

synchronized (lock) {   
    doSomething();       
}

2 ответа

Решение

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

Блокировка гарантированно будет снята во всех случаях, и исключение не является исключением (каламбур).

Как и следовало ожидать, блокировка снимается нормально.

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

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

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

Другие вопросы по тегам