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


Sujet :

Concurrence et multi-thread Java

  1. #1
    Membre averti Avatar de soad
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    520
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Suisse

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Février 2004
    Messages : 520
    Points : 439
    Points
    439
    Par défaut [Thread]Synchronized
    hello tout le monde...

    j'ai quelque question sur le synchronized...


    toute les methodes qui ont un synchronized ne peuvent pas être exécuté si une des méthodes est en cours d'exécution ! c'est bien ca ???


    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
    20
    21
    22
    23
     
     
    public classe Calcule {
      private int x = 5, y = 2, resultat;
     
     
      public synchronized void additionne() {
     
        resultat = x+y;
      }
     
     
      public synchronized int getResultat() {
     
        return resultat;
      }
     
     
      public int getX() {
     
        return x;
      }
    }

    si j'ai un Thread qui exécute la méthode additionne() seule la methode getX() pourra être appeler par un autre Thread ???

  2. #2
    Membre expérimenté Avatar de herve91
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    1 282
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 1 282
    Points : 1 608
    Points
    1 608
    Par défaut Re: [synchronized]
    toute les methodes qui ont un synchronized ne peuvent pas être exécuté si une des méthodes est en cours d'exécution ! c'est bien ca ???
    oui, pour un même objet, si une des méthodes synchronized est en cours d'exécution.
    si j'ai un Thread qui exécute la méthode additionne() seule la methode getX() pourra être appeler par un autre Thread ???
    Exactement, sur la même instance d'objet.

  3. #3
    Membre habitué
    Homme Profil pro
    Développeur Java
    Inscrit en
    Juillet 2004
    Messages
    138
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : Service public

    Informations forums :
    Inscription : Juillet 2004
    Messages : 138
    Points : 125
    Points
    125
    Par défaut
    Lorsque tu mets synchonized, la méthode ou la classe ne peut être utilisé que par un seul Thread à la fois.
    Maintenant dans ton cas, tes méthodes ne pourront être exécuté en même temps par deux Threads différents, l'un des deux devra attendre que l'autre ait fini.

  4. #4
    Membre averti Avatar de soad
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    520
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Suisse

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Février 2004
    Messages : 520
    Points : 439
    Points
    439
    Par défaut
    ok alors si je fais ca:


    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
     
     
    public classe Calcule { 
      private int x = 5, y = 2, resultat; 
     
     
      public synchronized void additionne() { 
     
        resultat = x+y; 
      } 
     
     
      public synchronized int getResultat() { 
     
        additionne();
        return resultat; 
      } 
    }

    est ce que une methode synchronized peut en appeler une autre ? vu que getResultat() est en cours d'exécution est ce que additionne() pourra etre appeller ?

  5. #5
    Membre expérimenté Avatar de herve91
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    1 282
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 1 282
    Points : 1 608
    Points
    1 608
    Par défaut
    Oui, car le moniteur (l'objet attaché à ton instance de Calcule qui sert au contrôle des accès concurrents) est déjà pris par la méthode getResultat(), il ne sera relaché qu'à la fin de son exécution.

  6. #6
    Membre habitué
    Homme Profil pro
    Développeur Java
    Inscrit en
    Juillet 2004
    Messages
    138
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : Service public

    Informations forums :
    Inscription : Juillet 2004
    Messages : 138
    Points : 125
    Points
    125
    Par défaut
    Mais le mieux, et dites moi si je me trompe, est de mettre ta classe en synchronized...

  7. #7
    Membre expérimenté Avatar de herve91
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    1 282
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 1 282
    Points : 1 608
    Points
    1 608
    Par défaut
    Le mot-clé synchronized n'existe pas au niveau classe...

  8. #8
    Membre averti Avatar de soad
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    520
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Suisse

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Février 2004
    Messages : 520
    Points : 439
    Points
    439
    Par défaut
    oki merci beaucoup pour vos réponse

  9. #9
    Membre actif
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    220
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 220
    Points : 266
    Points
    266
    Par défaut
    A priori, (mais j'avoue que tu me mets le doute..) je te dirai oui, parce que tu es déjà dans l'objet qui appelle la méthode... tu restes en interne, tu ne sors pas de ton thread dans ton execution...

    Maintenant, ca n'a pas forcement de sens de le faire comme ca, dans ton cas...

    Si tu fais un traitement en synchronized, y'a t'il un interet à ce que additionne soit en synchronized si pour l'appeler tu passes par GetResultat ?

    Ou y a t'il vraiment besoin d'appeler additionne dans GetResultat, alors que tu peux y accéder directement avant ?
    Pour moi, ca n'a pas lieu d'etre dans GetResultat, mais c'est mon avis perso... Ne mets en synchronized que ce qui a réellement besoin de l'être.

  10. #10
    Membre expérimenté Avatar de herve91
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    1 282
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 1 282
    Points : 1 608
    Points
    1 608
    Par défaut
    A priori, (mais j'avoue que tu me mets le doute..) je te dirai oui, parce que tu es déjà dans l'objet qui appelle la méthode... tu restes en interne, tu ne sors pas de ton thread dans ton execution...
    Ca signifie quoi "tu ne sors pas de ton thread dans ton execution" ?
    Comment peut-on sortir d'un thread ?
    Ca marche tout simplement parce que le moniteur est le même pour toutes les méthodes synchronisées. Quand on fait :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    public synchronized void additionne() { 
      resultat = x+y; 
    }
    c'est équivalent à :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    public void additionne() { 
      synchronized(this) {
        resultat = x+y; 
      }
    }
    le moniteur est l'objet "this" (l'instance courante).
    Mais on peut très bien faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    Objet monitor = new Object();
     
    public void additionne() { 
      synchronized(monitor) {
        resultat = x+y; 
      }
    }
     
    public int getResultat() { 
      synchronized(monitor) {
        additionne();
        return resultat;
      }
    }
    Dans ce cas, la synchronisation n'a lieu que sur les accès à l'objet "monitor", et pas sur "this".

  11. #11
    Membre actif
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    220
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 220
    Points : 266
    Points
    266
    Par défaut
    Ca signifie quoi "tu ne sors pas de ton thread dans ton execution" ?
    Comment peut-on sortir d'un thread ?
    Scuse moi hervé, t'énerve pas, j'avoue en me relisant que je me suis très mal exprimé et que le terme thread etait très mal utilisé... Pas taper s'il te plait...

  12. #12
    Membre expérimenté Avatar de herve91
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    1 282
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 1 282
    Points : 1 608
    Points
    1 608
    Par défaut
    Non, non, pas taper...

  13. #13
    Membre actif
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    220
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 220
    Points : 266
    Points
    266
    Par défaut
    Il y avait quand meme une certaine poesie lyrique ayant trait avec l'usage de substances illicites, pour ca, j'ai droit a un coup de marteau en moins quand meme ?

    Si tu utilises Java avec une conception non euclidienne, et avec un bon zeste de relativité, je suis sur que tu arriveras a y trouver un sens...

    Bon, j'arrete, sinon, ca va partir en delire...

  14. #14
    Membre averti Avatar de soad
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    520
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Suisse

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Février 2004
    Messages : 520
    Points : 439
    Points
    439
    Par défaut
    Citation Envoyé par ghorgor
    Si tu fais un traitement en synchronized, y'a t'il un interet à ce que additionne soit en synchronized si pour l'appeler tu passes par GetResultat ?

    Ou y a t'il vraiment besoin d'appeler additionne dans GetResultat, alors que tu peux y accéder directement avant ?
    Pour moi, ca n'a pas lieu d'etre dans GetResultat, mais c'est mon avis perso... Ne mets en synchronized que ce qui a réellement besoin de l'être.

    Oui dans ce cas si y a pas d'intéret mais c'étais juste un exemple bidon pour savoir si ca marchais !

  15. #15
    Expert éminent sénior
    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
    Points : 23 190
    Points
    23 190
    Billets dans le blog
    1
    Par défaut
    Salut,

    Cela ne répond pas à la question mais c'est juste pour information : depuis Java 5.0 il est possible de gérer les blocs synchronized via du code avec l'interface Lock et sa principale implémentation ReentrantLock :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    Lock l = ...; 
     
    l.lock();
    try {
             // access aux ressources protégés
    } finally {
    	l.unlock();
    }

    Le principal intérêt étant l'existance des méthodes tryLock() et tryLock(long,TimeUnit) qui permettent d'effectuer un traitement secondaire si le lock n'est pas disponible...

    Par exemple si on veut faire autre chose si on n'obtient pas la main au bout de 5 secondes :
    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
     
    private Lock lock = new ReentrantLock();
     
    public void method() {
    	String lResult = null;
    	if (lock.tryLock(5, TimeUnit.SECONDS)) {
    		try {
                  		// Traitement synchronisé
    		} finally {
    			lock.unlock();
    		}
    	} else {
    		// Traitement alternatif non-synchronizé
          }
    }
    a++

  16. #16
    Gfx
    Gfx est déconnecté
    Expert éminent
    Avatar de Gfx
    Inscrit en
    Mai 2005
    Messages
    1 770
    Détails du profil
    Informations personnelles :
    Âge : 42

    Informations forums :
    Inscription : Mai 2005
    Messages : 1 770
    Points : 8 178
    Points
    8 178
    Par défaut
    On peut aussi synchroniser des blocs de code sur un moniteur qu'on a defini (si on n'a pas Java 5) :

    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
     
    class MaClasse {
      private Object lock = new Object();
     
      public void calcul() {
        synchronized(lock) {
          // ...
        }
      }
     
      public int getResultat() {
        synchronized(lock) {
          // ...
        }
      }
    Mais il vaut mieux utiliser les solutions du JDK 1.5.

Discussions similaires

  1. [VB Net] Thread synchrone ?
    Par pinson dans le forum VB.NET
    Réponses: 3
    Dernier message: 20/04/2007, 08h58
  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