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

Mode arborescent

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

+ 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