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