Os efeitos colaterais de lançar uma exceção dentro de uma cláusula sincronizado?
-
19-09-2019 - |
Pergunta
Existem alguns efeitos colaterais claro para lançar uma exceção dentro de uma cláusula sincronizado? O que acontece com o bloqueio?
private void doSomething() throws Exception {...}
synchronized (lock) {
doSomething();
}
Solução
Não vejo nenhum efeito colateral.
O Bloqueio é garantido para ser terminada em todos os casos, e uma exceção não é excepção (trocadilho intencional).
Outras dicas
Como você esperaria, o bloqueio será liberado normalmente.
Para referência, a seção apropriada dos JLS que garante este comportamento é § 14,19 :
Se a execução do Bloco concluído normalmente, então o bloqueio é desbloqueado ea declaração sincronizado concluído normalmente. Se a execução do Bloco termina abruptamente por qualquer motivo, em seguida, o bloqueio é desbloqueado ea declaração sincronizado em seguida, conclui abruptamente pela mesma razão.
( 'conclusão abrupta' é definido em outro lugar nas JLS para incluir excepções JVM, excepções levantadas por throw
, e utilização do break
, continue
, ou declarações return
para transferência para fora do bloco.)