java - salida - ¿Efectos secundarios de lanzar una excepción dentro de una cláusula sincronizada?
propagacion de excepciones en java (2)
Como era de esperar, la cerradura se suelta normalmente.
Como referencia, la sección apropiada de JLS que garantiza este comportamiento es § 14.19 :
Si la ejecución del Bloque se completa normalmente, entonces el bloqueo se desbloquea y la instrucción sincronizada se completa normalmente. Si la ejecución del Bloque se completa abruptamente por algún motivo, entonces el bloqueo se desbloquea y la instrucción sincronizada se completa abruptamente por la misma razón.
(''finalización abrupta'' se define en cualquier parte del JLS para incluir excepciones de JVM, excepciones generadas por throw
y el uso de declaraciones break
, continue
o return
para transferir fuera del bloque).
¿Hay algún efecto secundario poco claro al lanzar una excepción desde dentro de una cláusula sincronizada? ¿Qué le sucede a la cerradura?
private void doSomething() throws Exception {...}
synchronized (lock) {
doSomething();
}
No veo ningún efecto secundario.
Se garantiza que la cerradura terminará en todos los casos, y una excepción no es una excepción (juego de palabras intencionado).