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 :
et
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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; }
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.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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(); } }
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
Partager