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 :

synchronisation : comment faire?


Sujet :

Langage Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre Expert
    Avatar de ®om
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    2 815
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 815
    Par défaut synchronisation : comment faire?
    Salut,

    J'ai une classe qui définit entre autres 2 méthodes:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    public boolean canPlay(...) { ... }
    public void play(...) {...}
    Pour faire play(...) il faut tester d'abord canPlay(...).

    Ayant plusieurs threads pouvant appeler ces méthodes, je cherche une solution pour être sûr de conserver un état "stable".

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    public synchronized boolean canPlay(...) { ... }
    public synchronized void play(...) {...}
    Si je rajoute le mot-clé "synchronized", il y aura toujours un problème, car aucune intervention d'un autre thread ne doit s'éxécuter entre canPlay() et play() (sinon le résultat de canPlay() risque de changer).

    Avez-vous une solution?

    EDIT: Je n'ai pas trouvé la DEUXIÈME PARTIE de ce tuto:
    http://alwin.developpez.com/tutorial/JavaThread/

  2. #2
    Membre Expert 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
    Par défaut
    Bonsoir,
    peut-être qq chose comme ça :
    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
    private boolean playable;
     
    public synchronized boolean canPlay(...) {
      boolean canPlay = false;
      if (!playable) {
        playable = canPlay = canPlayImpl(...);
      }
      return canPlay;
    }
     
    private boolean canPlayImpl(...) {
    }
     
    public synchronized void play(...)  {
      if (playable) {
        ...
        playable = false;
      }
    }

  3. #3
    Membre émérite
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    548
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 548
    Par défaut
    Il faut que le thread prenne le verrou sur l'objet, execute canPlay() puis (éventuellement) play() et enfin libère le verrou.

    Tu peux pour ça créer un bloc de code synchronisé sur l'objet (que j'appelle player) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    synchronized(player) {
       if (player.canPlay()) {
          player.play();
      }
    }
    Dans ce cas plus besoin que ces deux méthodes soient elles même synchronisées.

Discussions similaires

  1. [Administration] Comment faire une synchronisation automatique sur serveur?
    Par jumanji34 dans le forum Subversion
    Réponses: 0
    Dernier message: 01/12/2010, 22h32
  2. Réponses: 1
    Dernier message: 17/06/2007, 13h19
  3. Réponses: 8
    Dernier message: 18/09/2002, 03h20
  4. Comment faire pour mettre l'ecran en veille ?
    Par March' dans le forum MFC
    Réponses: 6
    Dernier message: 29/08/2002, 14h25
  5. Comment faire pour créer un bitmap
    Par GliGli dans le forum C++Builder
    Réponses: 2
    Dernier message: 24/04/2002, 15h41

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