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