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();
}
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).
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.)