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