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 :

[singleton][thread]accès aux methodes


Sujet :

Concurrence et multi-thread Java

  1. #1
    Membre habitué
    Inscrit en
    Décembre 2005
    Messages
    251
    Détails du profil
    Informations forums :
    Inscription : Décembre 2005
    Messages : 251
    Points : 143
    Points
    143
    Par défaut [singleton][thread]accès aux methodes
    Bonjour,

    Je souhaiterais savoir quand un singleton qui est partagé par plusieurs thread est ce que ses méthodes doivent être synchronized ?

    merci d'avance.

  2. #2
    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,


    Les méthodes doivent être thread-safe, c'est à dire qu'elles doivent pourvoir être exécuté depuis plusieurs threads sans que cela ne pose de problème.

    La synchronisation n'est qu'un des moyens permettant cela, mais ce n'est pas une obligation puisqu'il y a un grand nombre de manière de rendre une méthode thread-safe...

    a++

  3. #3
    Expert éminent
    Avatar de djo.mos
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    4 666
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 4 666
    Points : 7 679
    Points
    7 679
    Par défaut
    Salut,
    puisqu'il y a un grand nombre de manière de rendre une méthode thread-safe..
    Dont le plus simple est de ne pas accéder en écriture (parfois même en lecture) au champs de classe. Si une méthode n'utilise que des variables locales, elle devrait être thread-safe (devrait mais pas est, car tu peux utiliser un objet non thread-safe dans cette méthode )

  4. #4
    Membre habitué
    Inscrit en
    Décembre 2005
    Messages
    251
    Détails du profil
    Informations forums :
    Inscription : Décembre 2005
    Messages : 251
    Points : 143
    Points
    143
    Par défaut
    ok merci beaucoup pour ces précisions. elles sont très claires.
    Mais j'ai du mal à l'appliquer sur mon problème.

    J'ai une class extends thread qui a pour run :
    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 void run() 
            {
                try{
                    while(!Thread.currentThread().isInterrupted() && !stop)
                   {
                        while(!EnumCommande.isEmpty())
                        {
                            nbEssai = 0;
                            while(!envoieCommande(EnumCommande.get(0).toString()) && nbEssai<3)
                            {nbEssai++;}
                            EnumCommande.remove(0);
                        }
                        Thread.currentThread().sleep(1000);
                   }
                }
                catch(InterruptedException e){e.printStackTrace();}
     
            }
    et une methode public addCommande :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    public void addCommande(String commande)
            {
                EnumCommande.add(commande);
            }
    De plus j'ai un "serveur" qui dispatch des actions sur les thread.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    commande(string commande, int numThread)
    {
          if(numThread==1){thread1.addCommande(commande);}
          if(numThread==2){thread1.addCommande(commande);}
    }
    Ce "serveur" est lui même dispatché sur plusieurs autres thread (threadClient)
    si deux client appelle serveur.commande(blabla,1)
    comment cela se passe ?
    En fait je pensais que le fait de mettre toutes les commandes dans une list et de traiter ultérieurement me permettais d'éviter synchronized.

  5. #5
    Membre habitué
    Inscrit en
    Décembre 2005
    Messages
    251
    Détails du profil
    Informations forums :
    Inscription : Décembre 2005
    Messages : 251
    Points : 143
    Points
    143
    Par défaut
    Bonjour,

    Bon je crois que je me suis embrouillé l'esprit pour rien....

    J'ai toute de même une dernière question :
    Est ce l'ordre des demandes d'accès des thread à une méthode synchronized est respectée ?
    Exemple :
    thread 1 est dans la methode A
    thread 2 demande l'accès puis thread 3 demande l'accès. L'accès est refusé pour tous les deux.
    Lors du déblocage est ce que l'on est assuré que thread 2 exécutera en premier la methode A et pas thread 3 ?

    Merci d'avance.
    bonne journée

  6. #6
    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
    hello,

    on parle de fairness/unfairness. La dessus, je ne suis pas sur, mais il me semble qu'il n'y a aucune garantie la dessus.

    Il faut savoir aussi qu'une politique juste (fairness) a un cout, puisque tout le monde va attendre, que le premier se reveille, soit restaure, prenne le verrou, fasse son traitement le relache...

  7. #7
    Membre habitué
    Inscrit en
    Décembre 2005
    Messages
    251
    Détails du profil
    Informations forums :
    Inscription : Décembre 2005
    Messages : 251
    Points : 143
    Points
    143
    Par défaut
    bonjour,

    j'ai fais quelques tests et ça semble plutôt être farness. Mais bon avec les threads.... Je vais essayer de trouver une confirmation littéraire.

    merci

  8. #8
    Membre habitué
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    132
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mai 2007
    Messages : 132
    Points : 170
    Points
    170
    Par défaut
    java.util.concurrent.locks.ReentrantLock

    Cette classe accepte en paramètre le champ fair

    Par contre, le fait de vouloir délocker tout le monde dans le même ordre n'est pas sans conséquence et entraine des pertes de performances par rapport à un lock classique.

    Je te conseille donc de voir s'il y a pas moyen de se priver de cette option.

  9. #9
    Membre habitué
    Inscrit en
    Décembre 2005
    Messages
    251
    Détails du profil
    Informations forums :
    Inscription : Décembre 2005
    Messages : 251
    Points : 143
    Points
    143
    Par défaut
    effectivement le plus simple est de revoir l'architecture.

    Merci à tous et bonne journée

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

Discussions similaires

  1. Acces aux methodes des diapos
    Par tartiflette74 dans le forum VBA PowerPoint
    Réponses: 1
    Dernier message: 20/06/2007, 09h50
  2. Probleme d'acces aux methodes de mon assembly
    Par G_angel dans le forum C#
    Réponses: 1
    Dernier message: 24/04/2007, 15h55
  3. [C++ 1.1] Comment avoir accès aux méthodes d'une dll ?
    Par jacklsurf dans le forum Framework .NET
    Réponses: 6
    Dernier message: 15/04/2006, 22h49
  4. Réponses: 9
    Dernier message: 30/06/2005, 13h00
  5. Réponses: 38
    Dernier message: 16/02/2005, 02h03

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