IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage Java Discussion :

ReentrantLock dans un problème simple


Sujet :

Langage Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé Avatar de FidoDido®
    Profil pro
    Étudiant
    Inscrit en
    Décembre 2005
    Messages
    101
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2005
    Messages : 101
    Par défaut 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 : 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;
    	}
    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
    	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
    Fichiers attachés Fichiers attachés

  2. #2
    Membre Expert
    Avatar de professeur shadoko
    Homme Profil pro
    retraité nostalgique Java SE
    Inscrit en
    Juillet 2006
    Messages
    1 257
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 76
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : retraité nostalgique Java SE

    Informations forums :
    Inscription : Juillet 2006
    Messages : 1 257
    Par défaut
    euh, par hasard, tes variables toutLu et nbConso n'auraient pas besoin d'être volatile ?

  3. #3
    Membre confirmé Avatar de FidoDido®
    Profil pro
    Étudiant
    Inscrit en
    Décembre 2005
    Messages
    101
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2005
    Messages : 101
    Par défaut
    A priori la variable nbConso n'a pas besoin d'être volatile puisqu'elle ne varie pas au cours des accès concurrentiels, mais au moment de la création du SharedData et de l'ajout d'un consommateur supplémentaire à celui-ci.

    Pour ce qui est de ontLu, j'ai fait la modification, mais cela ne résoud pas mon problème. Au bout d'un certain temps (variable) le programme s'arrête.

  4. #4
    Membre confirmé Avatar de FidoDido®
    Profil pro
    Étudiant
    Inscrit en
    Décembre 2005
    Messages
    101
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2005
    Messages : 101
    Par défaut
    Tjs pas trouvé...
    Personne ne voit d'où ça pourrait venir ?

  5. #5
    Membre Expert
    Avatar de ®om
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    2 815
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 815
    Par défaut
    Avant de faire un await() il faut faire un test (on n'a pas toujours besoin d'attendre).
    Et ce test doit être dans un while et pas dans un if...
    (cf http://rom.developpez.com/java-synchronisation )

  6. #6
    Membre confirmé Avatar de FidoDido®
    Profil pro
    Étudiant
    Inscrit en
    Décembre 2005
    Messages
    101
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2005
    Messages : 101
    Par défaut
    OK mais le truc c que je vois pas quelle condition je dois vérifier pour pouvoir faire un await() dans ce cas...
    Ou alors faudrait que je créé une liste des consommateurs dans le SharedData qui indique si le consommateur courant a déjà lu ou non ?

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. problème simple dans JNI
    Par vbnet3 dans le forum NetBeans
    Réponses: 3
    Dernier message: 31/03/2011, 20h47
  2. Réponses: 4
    Dernier message: 10/11/2010, 22h01
  3. Problème sur une requête simple dans une table simple
    Par Muso tensei dans le forum PostgreSQL
    Réponses: 3
    Dernier message: 26/04/2009, 12h28
  4. Réponses: 9
    Dernier message: 19/05/2007, 15h28
  5. Problème simple d'apostrophe qui m'ennerve !
    Par beletteroi dans le forum Requêtes
    Réponses: 1
    Dernier message: 10/09/2005, 21h58

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo