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 :

Thread et synchronized. besoin d'aide.


Sujet :

avec Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    storm_2000
    Invité(e)
    Par défaut Thread et synchronized. besoin d'aide.
    Bonjour j'aimerais votre aide pour sécuriser mon application car j'ai quelque problème.
    J'ai une classe A qui est définir comme ceci en gros :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    class A {
      private List<A> enfants ;
      private A parent ;
    ....
    }
    Après, j'ai une classe avec que des méthode statique qui permette de
    sauvegarder, afficher, mettre a jour le contenu de A et ses enfants et sous enfants.
    par ex :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    public static void afficher(A noeud) {
     noeud.toString(); 
     for(int i=0;i<noeud.sizeEnfants();i++) {
        afficher(noeud.enfants(i);
     }
    }
    Et pour finir, j'ai plusieurs Thread qui se lance à des moments différents.
    un Thread pour 1 méthode statique.

    Mais voilà le problème :
    Deux méthode statique différente peuvent se retrouver dans le cas ou elle travaille sur le même objet. donc comment faire en forte que des qu'une méthode statique est appelée, les autre reste en attente, etc...

    Exemple :
    Le Thread A appel la méthode sauvegarder et place un point d'attente.
    - Le Thread B lance la mise a jour mais il y a un point d'attente donc il attend.
    - A viens de terminer sont traitement et vire le point d'attente.
    - Le thread B commence la mise a jour et place un point d'attente.

  2. #2
    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
    Si tu veux que chaque méthode static soit en exclusion des autres (ou d'elle-même), il suffit de les mettre toutes synchronized...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    public static synchronized void afficher(A noeud) {...}

  3. #3
    storm_2000
    Invité(e)
    Par défaut
    D'accord, mais ceci ne marche que si ce sont deux Thread ou plus qui appel la même méthode non ?
    Si les méthodes sont différentes et que nous voulons toutes les synchroniser ca marche aussi ?

  4. #4
    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
    Citation Envoyé par storm_2000
    D'accord, mais ceci ne marche que si ce sont deux Thread ou plus qui appel la même méthode non ?
    Si les méthodes sont différentes et que nous voulons toutes les synchroniser ca marche aussi ?
    Oui car synchronized sur une méthode ça revient au même que synchronized(this) (donc le verrou est l'objet), et dans le cas des méthodes statiques ça revient au même que synchronized(TaClass.class).

    http://rom.developpez.com/java-synchronisation/

  5. #5
    Membre éclairé Avatar de Razgriz
    Profil pro
    Professeur / chercheur en informatique / mathématiques
    Inscrit en
    Avril 2006
    Messages
    391
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Professeur / chercheur en informatique / mathématiques

    Informations forums :
    Inscription : Avril 2006
    Messages : 391
    Par défaut
    Une autre solution nettement plus compliquée mais préférrée par certains programmeurs depuis son apparition en jdk 5.0 car rappellant très fortement la théorie de la concurence en base de données est l'utilisation de vérous. En gros ça se présente toujours de la même manière.

    - Utiliser des objets de condition fournis par la classe ReentrantLock.
    - initialiser un de ces objets dans la classe qui fournit les objets à protéger.
    - protéger le code qui doit être synchronisé.

    Le mot clé synchronized fournit brutalement l'objet de condition et synchronise toute la méthode. Les objets de condition permettent d'avoir un meilleur contrôle sur ce qu'on veut protéger. Voici ci-dessous un exemple d'une méthode de retrait d'argent, qui lance une exception si le montant demandé est négatif.

    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
    24
    25
    26
    27
     
    public class BankAccount
    {
         public BankAccount(double initialBalance)
         {
             this.balance = initialBalance; //solde initial du compte bancaire
             this.lock = new ReentrantLock(); //vérrou quis era associé à cet objet
         }
     
         public void withdraw(double amount)
         {
             lock.lock(); //acquisition du verrou
             try
             {
                 if(amount < 0)
                    throw new IllegalArgumentException("amount must be positive");
                 balance -= amount;
             }
             finally
             {
                 lock.unlock(); //relacher le verrou quoiqu'il arrive 
             }
         }
     
         private double balance;
         private ReentrantLock balance;
    }
    Rq : ces verrous sont dits rentrants car un thread peut acquérir à plusieurs reprises un vérrou q'il possède déjà.


    Une autre astuce en programmation avec thread est l'utilisations d'objets de condition, mais ce n'était pas ta question. Voilà sinon j'espère que tu as rélosu ton problème...

    Plus d'explications dans ces cours Java : http://java.developpez.com/cours/

  6. #6
    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
    L'utilisation des Locks de Java 5 est certes plus complet que le mot-clé synchronized, mais pas dans les examples que tu présentes...
    Si tu veux faire un bout de code synchronisé, tu peux très bien faire un synchronized(unMutex) { ... code en mutex }, et ça revient exactement au même que lock.lock() / lock.unlock().

    Là où ça a un intérêt, c'est quand tu as besoin de plusieurs variables conditions, et ça évite le cas suivant:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    synchronized(a) {
        synchronized(b) {
            b.wait(); //ne relâche pas le verrou de a
        }
    }

Discussions similaires

  1. besoin d'aide sur les thread
    Par demonofshadow dans le forum Windows Forms
    Réponses: 8
    Dernier message: 14/01/2010, 15h07
  2. [Thread] Besoin d'aide .
    Par licorn dans le forum Concurrence et multi-thread
    Réponses: 1
    Dernier message: 05/08/2009, 16h02
  3. Réponses: 4
    Dernier message: 23/12/2008, 08h34
  4. Thread besoin d'aide
    Par storm_2000 dans le forum Débuter avec Java
    Réponses: 0
    Dernier message: 25/09/2008, 18h03
  5. Besoin d'aide concernant l'utilisation de thread
    Par romain69 dans le forum Windows Forms
    Réponses: 1
    Dernier message: 06/03/2008, 17h21

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