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 :

Accès concurrentiel à un objet


Sujet :

Langage Java

  1. #1
    Membre confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2007
    Messages
    75
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2007
    Messages : 75
    Par défaut Accès concurrentiel à un objet
    Bonjour,

    j'ai deux threads qui accedent à un objet de type linkedList qui forme une file d'attente, l'un des threads emfile un ou des objets (addFirst) et l'autre retire ces objets (getLast), si la transaction réussit il fait removeLast.
    je veux savoir si je dois gerer l'accès concurrentiel de threads à 7 objet. tenant compte que l'un des threads change seulement le debut de la liste et l'autre la fin.
    sinon avec un exemple ce sera mieux.
    Merci d'avance

  2. #2
    Expert éminent
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Billets dans le blog
    1
    Par défaut
    Salut,


    Oui tu dois synchroniser les accès à la liste sous peine d'avoir de mauvaise surprise (et de manière totalement aléatoire).

    Si tu utilise Java 5.0 tu peux utiliser directement ConcurrentLinkedQueue...

    a++

  3. #3
    Membre confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2007
    Messages
    75
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2007
    Messages : 75
    Par défaut
    Merci bien adiGuba
    Oui, j'utilise java 5, donc je vais profiter de ConcurrentLinkedQueue.
    Est que vous avez une idée pour gerer la pérsistance de cette file pour eviter tout éventuelle perte, que se soit JDO ou autres .

    Remerci

  4. #4
    Membre confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2007
    Messages
    75
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2007
    Messages : 75
    Par défaut
    Salut,
    J'ai deux threads qui accèdent à une file d'attente, l'un dépose l'autre retire les objets de le file, j'ai pu developper le code au dessous et ça marche, mais le pb, c'est que je ne peux pas deposer sans retirer.ce-ci dû au fait que le thread reste en wait() jusqu'à notify(), qui vient de l'autre thread .donc je veux savoir d'après vous qu'elles sont les modifs necessaire pour que le thread déposant puisse deposer sans que l'autre retire ! ;-)
    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
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
     
     
    import java.util.concurrent.ConcurrentLinkedQueue;
     
    public class FileAttente {
    	private ConcurrentLinkedQueue<ElemFileAttente> file = new ConcurrentLinkedQueue<ElemFileAttente>();
     
    	private boolean available = false;
     
    	public synchronized void emfiler(ElemFileAttente elem) {
    		while (available == true) {
    			try {
    				wait();
    			} catch (InterruptedException e) {
    			}
     
    		}
    		file.add(elem);
    		available = true;
    		System.out.println("th1: Depot\n");
    		notifyAll();
     
    	}
     
    	public synchronized ElemFileAttente defiler() {
    		ElemFileAttente elem = null;
    		while (available == false) {
    			try {
    				wait();
    			} catch (InterruptedException e) {
    			}
     
    		}
    		elem = (ElemFileAttente) file.poll();
    		available = false;
    		System.out.println("th2: Retrait \n");
    		notifyAll();
     
    		return elem;
     
    	}
     
    }

  5. #5
    Expert éminent
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par Dev_info
    donc je veux savoir d'après vous qu'elles sont les modifs necessaire pour que le thread déposant puisse deposer sans que l'autre retire ! ;-)
    Tu n'as pas besoin de gérer la synchronisation: c'est déjà fait par la ConcurrentLinkedQueue. Cette classe permet à un thread d'ajouter des éléments à une queue pendant qu'un autre les enlève, sans que les deux threads ne se bloquent mutuellement (mis à part en cas d'accès simultanée).

    Par contre si tu veux un comportement bloquant, il vaut mieux utiliser les BlockingQueue, par exemple :

    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
    public class FileAttente {
    	private BlockingQueue<ElemFileAttente> file = new LinkedBlockingQueue<ElemFileAttente>(1); // 1 seul élément
     
    	public void emfiler(ElemFileAttente elem) {
    		// Ajout d'un element dans la queue,
    		// (bloquant si la queue est pleine)
    		file.put(elem);
    		System.out.println("th1: Depot\n");
    	}
     
    	public ElemFileAttente defiler() {
    		// Récupération d'un élément
    		// (bloquant si la queue est pleine)
    		ElemFileAttente elem = file.take();
    		System.out.println("th2: Retrait \n");
    		return elem;
     
    	}
    }
    a++

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

Discussions similaires

  1. [Thread]Accès concurrentiel -> Synchronized
    Par m@t dans le forum Concurrence et multi-thread
    Réponses: 2
    Dernier message: 12/12/2005, 12h21
  2. MyISAM & les accès concurrentiels: le "miracle"
    Par twkjp dans le forum Outils
    Réponses: 3
    Dernier message: 09/09/2005, 17h02
  3. [VB.NET] Accès concurrentiel
    Par lecitoyen dans le forum ASP.NET
    Réponses: 5
    Dernier message: 03/03/2005, 20h23
  4. [VB.NET] Accès concurrentiel aux fichiers
    Par david71 dans le forum Windows Forms
    Réponses: 6
    Dernier message: 13/12/2004, 11h19
  5. [Access] Accès concurrentiels
    Par Benjamin GAGNEUX dans le forum Bases de données
    Réponses: 4
    Dernier message: 12/07/2004, 17h56

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