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

avec Java Discussion :

Synchronisation thread avec boolean


Sujet :

avec Java

  1. #1
    Membre à l'essai
    Inscrit en
    Juin 2006
    Messages
    40
    Détails du profil
    Informations forums :
    Inscription : Juin 2006
    Messages : 40
    Points : 20
    Points
    20
    Par défaut Synchronisation thread avec boolean
    Salut,
    je sais qu'il existe ces merveilleuses méthodes wait(), et notifyAll() associées aux mots clés synchronized pour gérer tout ce qui concerne la synchronisation de thread en java mais j'ai besoin d'une confirmation quant à une de mes intérrogations.

    On ne peut pas utiliser un booléen pour synchroniser deux threads? En gros, les deux threads partages un booléen (synchronized) et le thread A, doit attendre que le thread B passe le booléen à true pour continuer un traitement.

    Donc j'ai en gros pour thread A:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    public void run() {
    		try {
    			while(true)
                           {
                                     while(!objetPartage.getBoolean())
                                    {  
                                           // Je fais le traitement car B a fini
    				}
                            }
    Pour le thread B:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    public void run() {
    		try {
    			while(true){
                                     objetPartage.setBoolean(true); 
                            }
    Y'a bien sûr du code dans le thread A et B et un traitement associé dans B pour pas qu'il fasse que mettre le booléen à true.
    Mais bon, la question, c'est, est-ce mal de procéder comme cela? Et si oui pourquoi? Moi j'aimerai que ça soit mal mais j'en suis pas sûr...

    Merci d'avance...

  2. #2
    Rédacteur
    Avatar de CyberChouan
    Homme Profil pro
    Directeur technique
    Inscrit en
    Janvier 2007
    Messages
    2 752
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Directeur technique
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Janvier 2007
    Messages : 2 752
    Points : 4 314
    Points
    4 314
    Par défaut
    Ton intuition est bonne: c'est plus mal que wait et notify!

    Ta boucle infinie et le test du booléen vont être effectués continuellement jusqu'à ce que le booléen change de valeur: donc cela va consommer des ressources.
    Le wait, au contraire, va "endormir" ton Thread et celui-ci ne va plus consommer de ressources jusqu'à ce qu'il soit réveillé par un "notify": c'est donc bien plus efficace (en terme de performances).

    Parfois, deux threads doivent communiquer via des variables partagées: lorsque c'est le cas (comme dans ton exemple), tu ne dois pas oublier de déclarer ta variable (ici ton booléen) comme volatile. Sinon ton code pourrait s'avérer buggué et dans ton cas par exemple, le programme pourrait ne jamais effectuer le traitement.

    La JVM peut décider, comme ton thread ne modifie pas le booléen, de mettre sa valeur en cache au lieux de le relire par soucis d'optimisation. Ainsi, lorsqu'un autre thread modifie sa valeur, celle-ci n'est pas prise en compte par le premier qui continue d'utiliser la valeur en cache.
    Le mot-clé volatile force la JVM a raffraichir la variable à partir de sa valeur réelle (cf. la FAQ du site site sur les mots-clé).
    Avant de poster, pensez à regarder la FAQ, les tutoriaux, la Javadoc (de la JRE que vous utilisez) et à faire une recherche
    Je ne réponds pas aux questions techniques par MP: les forums sont faits pour ça
    Mes articles et tutoriaux & Mon blog informatique

  3. #3
    Membre éclairé

    Inscrit en
    Juillet 2008
    Messages
    232
    Détails du profil
    Informations forums :
    Inscription : Juillet 2008
    Messages : 232
    Points : 837
    Points
    837
    Par défaut
    Ce code montre une attente active, ce qui occupe le processeur en permanence. Si c'est ton but pourquoi pas

    Avec wait le thread s'interrompt jusqu'a ce qu'il puisse progresser a nouveau (notify). Donc le processeur peut s'occuper a d'autres taches pendant ce temps.

    En tout cas CyberChouan doit avoir raison avec volatile, il faut se mefier des optimisations mal placees

  4. #4
    ndp
    ndp est déconnecté
    Membre actif Avatar de ndp
    Profil pro
    Inscrit en
    Mars 2003
    Messages
    227
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2003
    Messages : 227
    Points : 255
    Points
    255
    Par défaut
    Salut,
    Citation Envoyé par CyberChouan Voir le message
    ...
    Parfois, deux threads doivent communiquer via des variables partagées: lorsque c'est le cas (comme dans ton exemple), tu ne dois pas oublier de déclarer ta variable (ici ton booléen) comme volatile. Sinon ton code pourrait s'avérer buggué et dans ton cas par exemple, le programme pourrait ne jamais effectuer le traitement.
    ...
    entierement d'accord avec toi, excepte que la, en l'occurence, il n'y a pas besoin du mot cle volatile.

    Citation Envoyé par the_ionic Voir le message
    ... En gros, les deux threads partages un booléen (synchronized) et le thread A, doit attendre que le thread B passe le booléen à true pour continuer un traitement.
    ...

  5. #5
    Membre à l'essai
    Inscrit en
    Juin 2006
    Messages
    40
    Détails du profil
    Informations forums :
    Inscription : Juin 2006
    Messages : 40
    Points : 20
    Points
    20
    Par défaut
    Réponse parfaite, avec la précision du volatile en plus qui pourrait m'être utile par la suite.
    Sincèrement merci!

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

Discussions similaires

  1. Réponses: 13
    Dernier message: 11/06/2015, 15h51
  2. [WD17] Synchronisation de threads avec signaux, comportement bizarre
    Par droliprane dans le forum WinDev
    Réponses: 7
    Dernier message: 08/10/2014, 18h57
  3. Synchronisation des threads avec deux sémpahores
    Par pupucette dans le forum C++
    Réponses: 0
    Dernier message: 27/01/2013, 22h17
  4. Synchronisation de Threads avec un systeme de signal/event
    Par Niklaos dans le forum Threads & Processus
    Réponses: 23
    Dernier message: 03/01/2010, 19h01
  5. synchronisation Thread main avec sous thread
    Par glasgow dans le forum Concurrence et multi-thread
    Réponses: 20
    Dernier message: 25/05/2009, 15h03

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