64 votes

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

Existe-t-il des effets secondaires peu clairs lors du lancement d'une exception à partir d'une clause synchronisée? Qu'advient-il de la serrure?

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

synchronized (lock) {   
    doSomething();       
}
 

94voto

KLE Points 11711

Je ne vois aucun effet secondaire.

Le verrouillage est garanti d'être terminé dans tous les cas, et une exception ne fait pas exception (jeu de mots).

39voto

Cowan Points 17235

Comme vous l'espère, le verrou est libéré normalement.

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

Si l'exécution du Bloc se termine normalement, la serrure est déverrouillée et synchronisée de déclaration se termine normalement. Si l'exécution du Bloc se termine brusquement pour une raison quelconque, la serrure est déverrouillée et synchronisée déclaration puis termine brusquement pour la même raison.

('brusque achèvement" est défini ailleurs dans le JLS inclure les exceptions de la JVM, les exceptions soulevées par throw, et l'utilisation de l' break, continueou return des déclarations de transfert à l'extérieur du bloc.)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X