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