2016-09-19 2 views

Répondre

0

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:

  1. 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.
  2. 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.