Votre code ressemble à ceci:
@ReleasesNoLocks
void proc() {
...
unfree(); // line 52
...
}
void unfree() {
// arbitrary code that might include someLock.unlock();
}
La documentation @ReleasesNoLocks
dit:
La méthode, et toutes les méthodes qu'elle appelle, maintenir un taux de maintien de verrouillage strictement non décroissante
L'annotation @ReleasesNoLocks
sur la méthode proc
promesse s cette méthode proc
ne libère aucun verrou. Toutefois, la méthode unfree
peut libérer certains verrous (car elle n'est pas annotée comme @ReleasesNoLocks
). Si unfree
libère un verrou, alors proc
enfreint sa spécification. C'est ce que dit le message de Lock Checker (de manière concise).
Il y a trois possibilités pour ce qui se passe au moment de l'exécution:
unfree
ne vraiment libérer un verrou. Dans ce cas, votre code est bogué et Lock Checker vous en a parlé! L'annotation @ReleasesNoLocks
sur proc
est fausse. Vous devez supprimer cette annotation ou modifier unfree
pour ne pas libérer de verrous.
unfree
ne libère jamais de verrou. Dans ce cas, vous devez annoter unfree
comme @ReleasesNoLocks
. À ce stade, le vérificateur de verrouillage sera en mesure de vérifier que l'implémentation de proc
satisfait à sa spécification, de sorte qu'il n'émettra plus l'avertissement. Parfois, il libère un verrou et parfois ne libère pas de verrou. Vous savez que l'appel particulier dans le corps de proc
ne libère pas un verrou. Dans ce cas, vous devez écrire une annotation @SuppressWarnings("method.guarantee.violated")
à la ligne 52 de votre code source. La clé "method.guarantee.violated" apparaît dans le message d'erreur. Je recommande d'ajouter un commentaire expliquant comment vous connaissez ce fait, afin que vous sachiez à l'avenir pourquoi vous avez écrit l'annotation @SuppressWarnings
.