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

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

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

synchronized (lock) {   
    doSomething();       
}

Ответы [ 2 ]

89 голосов
/ 07 января 2010

Не вижу побочного эффекта.

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

39 голосов
/ 07 января 2010

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

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

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

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

...