Los efectos secundarios de lanzar una excepción dentro de una cláusula sincronizada?
-
19-09-2019 - |
Pregunta
¿Hay efectos secundarios poco claras a lanzar una excepción dentro de una cláusula sincronizada? ¿Qué ocurre con la cerradura?
private void doSomething() throws Exception {...}
synchronized (lock) {
doSomething();
}
Solución
No veo ningún efecto secundario.
La bloqueo está garantizado para ser terminado en todos los casos, y una excepción no es una excepción (juego de palabras).
Otros consejos
Como era de esperar, el bloqueo se libera normalmente.
Para referencia, la sección correspondiente de la JLS que garantiza este comportamiento es § 14.19 :
Si la ejecución del bloque se completa con normalidad, entonces el bloqueo está desbloqueado y el estado sincronizado se completa con normalidad. Si la ejecución del bloque termina bruscamente por cualquier razón, entonces el bloqueo está desbloqueado y el estado sincronizado completa entonces bruscamente por la misma razón.
( 'terminación abrupta' se define en otra parte en el JLS para incluir excepciones de JVM, excepciones planteadas por throw
, y el uso de los break
, continue
, o declaraciones return
para transferir fuera del bloque.)