web-dev-qa-db-fra.com

Les effets secondaires du lancement d'une exception dans une clause synchronisée?

Y a-t-il des effets secondaires peu clairs à lever une exception à partir d'une clause synchronisée? Qu'arrive-t-il à la serrure?

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

synchronized (lock) {   
    doSomething();       
}
64
Yossale

Je ne vois aucun effet secondaire.

Le le verrouillage est garanti terminé dans tous les cas, et une exception n'est pas une exception (jeu de mots voulu).

91
KLE

Comme vous pouvez l'espérer, le verrou est libéré normalement.

Pour référence, la section appropriée du JLS qui garantit ce comportement est § 14.19 :

Si l'exécution du bloc se termine normalement, le verrou est déverrouillé et l'instruction synchronisée se termine normalement. Si l'exécution du bloc se termine brusquement pour une raison quelconque, le verrou est déverrouillé et l'instruction synchronisée se termine alors brusquement pour la même raison.

('achèvement brutal' est défini ailleurs dans le JLS pour inclure les exceptions de la machine virtuelle Java, les exceptions déclenchées par throw et l'utilisation de break, continue ou return instructions à transférer en dehors du bloc.)

39
Cowan