J'ai un morceau de code que je suis en train d'examiner (à l'aide de FindBugs ).
public class MyClass{
...
private BlockedQueue q = new LinkedBlockingQueue<MyData>(1000);
private static final batchSize = 1000;
public boolean testMethod(){
boolean done = false;
synchronized(q){
if(q.size == batchSize){
q.notify();
done = true;
}
}
return done;
}
Lorsque j'exécute FindBugs sur ce morceau de code, il se plaint que -
Cette méthode réalise la synchronisation d'un objet qui est une instance d'une classe du paquet java.util.concurrent (ou ses sous-classes). Les instances de ces classes ont leur propre méthode mécanismes de contrôle de la concurrence qui qui sont distincts de et incompatibles avec l'utilisation du mot-clé synchronisé.
Si je commente le morceau de code synchronisé synchronized(q){
il se plaint -
Cette méthode appelle Object.notify() ou [ ] détenir un verrou sur l'objet. L'appel à notify() ou notifyAll() sans que le verrou ne soit détenu, il en résultera un IllegalMonitorStateException étant lancée à l'adresse
Comment implémenter cette méthode pour qu'elle passe la validation de FindBugs ? L'implémentation ci-dessus est-elle la bonne pour la notification dans les cas de classes concurrentes ?
Merci.