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

Concurrence et multi-thread Java Discussion :

thread, synchronized et notify


Sujet :

Concurrence et multi-thread Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éprouvé Avatar de julien.63
    Profil pro
    balayeur
    Inscrit en
    Décembre 2005
    Messages
    1 348
    Détails du profil
    Informations personnelles :
    Localisation : France, Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : balayeur

    Informations forums :
    Inscription : Décembre 2005
    Messages : 1 348
    Par défaut thread, synchronized et notify
    salut,
    J'aimerai avoir un éclaircissement dans la continuité de ce post : http://www.developpez.net/forums/sho...t=synchronised

    Il est dit dans le dernier message :
    si un autre thread posséde ce moniteur, ton thread va attendre que le moniteur soit libéré pour pouvoir l'acquerir.
    L'acquisition du moniteur est-elle automatique? si oui à quoi sert le notify () et le wait()?

  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,



    Lorsque tu utilises un synchronized() le moniteur est automatiquement posé sur la référence que tu utilises, par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    synchronized (monObject) {
     
       ...
     
    }
    Ce code essaye d'acquérir le moniteur sur la référence monObject :
    • Si le moniteur est déjà pris, le thread va attendre qu'il soit libéré.
    • Si le moniteur est libre, il va l'acquérir et pourvoir exécuter le code à l'intérieur du bloc.



    notify() et wait() sont deux méthodes qui doivent impérativement être utilisé dans un bloc synchronized sur une référence dont on a pris le moniteur.

    • wait() permet d'endormir le thread courant et de rendre le moniteur tout en restant à l'intérieur du bloc synchronized().
    • notify() permet de réveiller un thread précédemment endormi avec wait().


    Tout cela permet de synchronisé deux thread entre eux



    Maintenant si tu es sous Java 5.0 je te conseille plutôt de te tourner vers les packages java.util.concurrent


    a++

  3. #3
    Membre éprouvé Avatar de julien.63
    Profil pro
    balayeur
    Inscrit en
    Décembre 2005
    Messages
    1 348
    Détails du profil
    Informations personnelles :
    Localisation : France, Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : balayeur

    Informations forums :
    Inscription : Décembre 2005
    Messages : 1 348
    Par défaut
    ok, merci pour ta réponse.

    Dans mon cas, j'ai une application serveur et cliente qui se connectent via rmi.

    Le client crée et stocke un objet dans une HashMap, puis accède à ses méthodes.

    j'ai mis un synchronized uniquement sur les méthodes qui modifie le contenu de la HashMap car je pense que quand il recupère les données il n'y a pas de risque d'incohérence; qu'en pensez-vous?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    synchronized public boolean creer_compte(String id, double sommeInitiale) throws RemoteException {
    		try{
    			Compte c = new Compte(sommeInitiale);
    			compteMap.put(id, c);
    			return true;
    		}
    		catch(Exception e){return false;}
    	}

  4. #4
    Nouveau candidat au Club
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 3
    Par défaut
    C'est en général une mauvaise idée de laisser des accès entièrement non protégés.

    Si c'est juste la HashMap que tu dois protéger, je te conseilles l'utilisation d'une ConcurrentHashMap qui possède plusieurs avantages :
    * Tu n'as pas à gérer la synchronisation manuellement (donc moins de bugs potentiels)
    * Tu peux réaliser une itération pendant une écriture sans recevoir une ConcurrentModificationException

    Si tu tiens à réaliser la synchronisation manuellement je conseillerais d'utiliser un verrou de lecture/écriture (ReadWriteLock) qui permet plusieurs lectures simultanées mais une seule écriture (et pas de lectures pendant l'écriture).

  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 julien.63 Voir le message
    j'ai mis un synchronized uniquement sur les méthodes qui modifie le contenu de la HashMap car je pense que quand il recupère les données il n'y a pas de risque d'incohérence; qu'en pensez-vous?
    Je ne connais pas le fonctionnement interne des HashMap, mais il est possible que cela pose des problèmes...

    En effet si la Map est modifié pendant qu'un autre thread la lit il peut y avoir un état incohérent qui aboutira à une erreur incompréhensible !

    On ne doit jamais accéder en même temps en lecture et en écriture sur un élément.

    A la rigueur au lieu de synchronizé tes méthodes tu pourrais utiliser des Map synchronizé (via Collections.synchronizedMap()).

    Et si tu vraiment optimisé avec Java 5.0 tu peux te tourner vers les ReadWriteLock, qui permet d'empêcher des écritures/lectures simultané mais qui autorise plusieurs lecture en même temps...

    a++


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    synchronized public boolean creer_compte(String id, double sommeInitiale) throws RemoteException {
    		try{
    			Compte c = new Compte(sommeInitiale);
    			compteMap.put(id, c);
    			return true;
    		}
    		catch(Exception e){return false;}
    	}
    [/QUOTE]

Discussions similaires

  1. [Thread]Synchronized
    Par soad dans le forum Concurrence et multi-thread
    Réponses: 15
    Dernier message: 10/10/2005, 20h16
  2. [Thread][synchronized] Pb d'executions simultanees d'une methode
    Par Higestromm dans le forum Concurrence et multi-thread
    Réponses: 5
    Dernier message: 02/09/2005, 12h04
  3. [Thread][SYNCHRONIZED] problème de synchornisation
    Par _Eric_ dans le forum Général Java
    Réponses: 9
    Dernier message: 15/03/2005, 10h59
  4. [thread] synchronize ou pas ?
    Par dvarrel dans le forum Langage
    Réponses: 4
    Dernier message: 26/07/2004, 19h09
  5. [Thread] Synchronize
    Par Pedro dans le forum Langage
    Réponses: 9
    Dernier message: 06/07/2004, 13h30

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