J'ai un Collections.synchronizedList de WeakReference, _components;
J'ai écrit quelque chose comme ceci, en m'attendant à ce que le plaignant se plaigne:
public boolean addComponent2(Component e) {
synchronized (_components) {
return _components.add(new WeakReference<Component>(e));
}
}
Mais le compilateur est parfaitement satisfait. Notez que List.add () renvoie VRAI. Donc ok, toute sortie d'un bloc synchronisé libère le verrou, mais cela ne vous semble-t-il pas étrange? C'est un peu comme un "trou" dans le bloc, semblable à l'utilisation du retour dans une boucle.
Seriez-vous heureux de maintenir un code comme celui-ci?
C'est tout à fait correct - tout comme le retour d'une boucle ou d'un bloc try
qui a un bloc finally
approprié. Vous avez juste besoin d'être conscient de la sémantique, à quel point cela a un sens parfait.
C'est certainement du code plus simple que d'introduire une variable locale pour le plaisir:
// Ick - method body is now more complicated, with no benefit
public boolean addComponent2(Component e) {
boolean ret;
synchronized (_components) {
ret = _components.add(new WeakReference<Component>(e));
}
return ret;
}
Il n'y a rien de mal à retourner à l'intérieur d'un bloc synchronized
. Le verrou sera libéré correctement.