Les effets secondaires de lancer une exception dans une clause synchronisée?
-
19-09-2019 - |
Question
Y a-t-il des effets secondaires peu clairs à lancer une exception à l'intérieur une clause synchronisée? Qu'advient-il de la serrure?
private void doSomething() throws Exception {...}
synchronized (lock) {
doSomething();
}
La solution
Je ne vois pas d'effet secondaire.
verrouillage est garantie à fin dans tous les cas, et une exception ne fait pas exception (jeu de mots).
Autres conseils
Comme vous l'espoir, 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'état synchronisé se termine normalement. Si l'exécution du bloc se termine brusquement pour une raison quelconque, le verrou est déverrouillé et l'état synchronisé se termine alors brusquement pour la même raison.
( « achèvement brusque » est défini ailleurs dans la JLS d'inclure des exceptions JVM, les exceptions soulevées par throw
, et l'utilisation des break
, continue
ou déclarations de return
pour transférer à l'extérieur du bloc.)