1 pièce(s) jointe(s)
ReentrantLock dans un problème simple
Hello, je cherche à utiliser les ReentrantLock pour un problème simple de producteur/consommateurs.
Mais le programme a un comportement que je n'arrive pas à comprendre... :?
Je joins les fichiers .java correspondants
En gros, j'utilise un producteur, plusieurs consommateurs et entre les deux un objet SharedData qui fait la liaison et sur lequel se portent les problèmes de concurrence.
Le SharedData a un attribut data qui est la donnée partagée et les méthodes de get/set que voici :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
| public int getData(String name) throws InterruptedException{
locker.lock();
try {
if(ontLu >= nbConso) {
toutLu.signal();
}
else {
produit.signal();
}
/**
* tant que pas de production on attend
*/
produit.await();
ontLu++;
}
finally {
locker.unlock();
}
return data;
} |
et
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
| public void setData(int n) throws InterruptedException {
locker.lock();
try {
/**
* tant que tout n'a pas été lu, on attend
*/
toutLu.await();
data = n;
ontLu = 0;
/**
* on envoie le signal indiquant qu'une nouvelle valeur a été créée
* à tous les consommateurs
*/
produit.signal();
}
finally {
locker.unlock();
}
} |
où l'entier ontLu représente le nombre de consommateurs ayant lu le data à l'instant présent et nbConso est le nombre de consommateurs reliés au SharedData.
Donc si je fais un exemple simple (le producteur envoie un entier qu'il incrémente à chaque fois), au bout d'un certain temps je rentre en interblocage alors que ça marchait avant.
Et je ne comprends pas d'où ça vient...
Si quelqu'un pouvait m'aider ce serait cool.
Merci