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 :

problème de synchronisation


Sujet :

avec Java

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Août 2009
    Messages
    155
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2009
    Messages : 155
    Points : 85
    Points
    85
    Par défaut problème de synchronisation
    Bonjour,

    Mon application lance plusieurs threads qui exécutent une méthode d'une autre classe que celle qui lance les threads. A un moment dans cette méthode je fais un accès à une ressource properties que je modifie et dont va dependre la suite de ma methode.
    Je voudrais que les autres threads prennent en compte ces changement et surtout qu'il n'accède pas à cette ressource tant qu'un autre threads le fait.
    Après quelques recherches j'ai mis en place une section critique à l'aide d'un synchronized block.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
         synchronized (this) {
            //traitement de ma ressource
            //Affichage de ma ressource
         }
    Le problème est que je n'ai pas tout compris sur l'objet sur lequel on verrouille le bloc? (ici j'ai utilisé this comme dans l'exeple trouvé)
    Lorsque j'affiche ma ressource je retrouve deux threads dans ce bloc et donc affichant la meme valeur et je vois pas pourquoi?

    Merci d'avance pour votre aide...

  2. #2
    Membre habitué
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    121
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2007
    Messages : 121
    Points : 136
    Points
    136
    Par défaut
    Bonjour Titi42,

    Le problème est que je n'ai pas tout compris sur l'objet sur lequel on verrouille le bloc? (ici j'ai utilisé this comme dans l'exemple trouvé)
    Première chose à souligner:
    Ce ne sont pas les objets qui s'exécutent mais ce sont les threads qui exécutent les méthodes/instructions de ces objets.
    La plus part des objets sont passifs. Seul les threads sont actifs.

    Donc dans un objet X ... synchronized(Y){...} donne les instructions au thread (T) en cours d'exécution sur l'objet X:
    1. T attend jusqu'à ce que Y ne soient plus pris par un autre thread
    2. T prend l'objet Y en exclusivité
    3. T exécute ce bloc d'intruction de l'objet X
    4. T libère l'objet Y et notifie les threads qui attendent cet objet Y.

    Par analogie...
    Imagine deux cuisiniers (deux Threads T) qui utilisent un livre de recettes (tes instructions X) en même temp mais qui doivent se partager certains ustensiles (tes ressouces Y). Pour que les deux cuisiniers ne mélangent pas leurs ingrédients dans la même casserole...Les instructions qui utilisent la même casserole doivent être synchronisées sur l'utilisation de cette casserole. Et ce pour chaque ustensile partagé dans chaque recette.
    Attention l'utilisation simultanée et exclusive de multiples objets peut rapidement déboucher sur un blocage mutuel des préparations (deadlock).
    L'utilisation du synchronized doit donc se faire de manière réfléchie.
    Tu peux aussi décider de n'exécuter qu'une recette à la fois (synchonisé sur le livre de recettes).

    Donc, dans synchronized(this){...} , this ne doit PAS représenter le thread en cours mais la ressource dont dépend l'exécution de ce thread.

    J'espère t'avoir éclairé pour ton problème
    A+

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Août 2009
    Messages
    155
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2009
    Messages : 155
    Points : 85
    Points
    85
    Par défaut
    Bonjour rebel64,

    Donc si j'ai bien compris mon Objet X est ma classe dans laquelle est définie ma méthode et mes ressources Y seraient les données utiles qui se trouvent dans mon fichier properties.

    J'ai donc fais
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    synchronized (maRessource) {
            //traitement de ma ressource
            //Affichage de ma ressource
         }
    Et ça MARCHE MERCI...


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

Discussions similaires

  1. problème de synchronisation de thread
    Par youp_db dans le forum Entrée/Sortie
    Réponses: 2
    Dernier message: 11/10/2006, 11h34
  2. [VB.net] Problème de synchronisation d'une base
    Par WriteLN dans le forum Windows Forms
    Réponses: 18
    Dernier message: 21/10/2005, 13h11
  3. Problème de synchronisation...
    Par sankookai dans le forum MFC
    Réponses: 10
    Dernier message: 16/02/2005, 14h03
  4. [C#] Problème de synchronisation de combobox
    Par WwiloO dans le forum Windows Forms
    Réponses: 3
    Dernier message: 20/12/2004, 19h56
  5. Problème de synchronisation dans un JTextArea
    Par wutang dans le forum Composants
    Réponses: 3
    Dernier message: 21/06/2004, 15h06

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