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

Java Discussion :

[Java] Soucis de synchronisation


Sujet :

Java

  1. #1
    Membre éclairé Avatar de GyZmoO
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    428
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Février 2006
    Messages : 428
    Par défaut [Java] Soucis de synchronisation
    Bonjour à tous.

    L'application sur laquelle je travaille présente un dysfonctionnement (un thread se "bloque" pendant 1~2 Heures... Puis reprend sa vie.)

    Le thread en question se présente comme ceci :


    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 run()
    {
         while (_running)
         {
            if (_workRequested)
            {
              doSomeWork();
            }
            else
            {
              try
              {
                Thread.sleep(200);
              }
              catch (InterruptedException e)
              {
                treatInterruptedException(e);
              }
            }
         }
    }
    En gros, il boucle, regarde si on lui demande du boulot sinon il dort pendant 200 ms et ainsi de suite.

    Le code de la méthode doSomeWork() se présente comme ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
     
    private void doSomeWork()
    {
       synchronized(MySingleton.getInstance())
      {
        // work !
      }
    }
    On s'apperçoit que le "blocage" se fait sur le synchronized(MySingleton.getInstance()) (nous l'avons constaté au moyen de traces.)

    Le MySingleton est, comme son nom l'indique un objet unique :

    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
     
     
    public class MySingleton
    {
      private static _instance = null;
     
      private MySingleton()
      {
        // Constructor
      }
     
      public static synchronized getInstance()
      {
        if (_instance == null)
        {
          _instance = new MySingleton();
        }
        return _instance;
      }
    }
    Le phénomène étrange est que, ce singleton en question est "attaqué" par un nombre important de threads, qui eux ne se bloquent pas (contrairement au Thread cité plus haut).

    Les méthodes de ce singleton sont pour la plupart synchronized.

    Mais voila, notre Thread en question arrive sur ce synchronized(MySingleton.getInstance()) et il y reste entre 1 & 2 heures (ce probème apparait de manière aléatoire, sinon ça ne serait pas drôle...) .

    Donc je veux bien, cet objet singleton est attaqué par plusieurs Threads (peut être 10 au maximum), mais je ne comprend pas pourquoi mon Thread ne reçoit jamais "la priorité" ...

    A noter que, aucun Thread n'a vu sa priorité modifiée par l'appel de méthode setPriority(int p)...

    Et là je dois vous dire que je ne vois absolument pas ce qui se passe...

    Si vous avez la moindre idée/remarque/critique, n'hésitez pas !! Merci


    [Edit] Le fait que l'on tente d'effectuer un bloc synchronized en appelant la
    méthode getInstance() du singleton qui elle même est synchronized peut-il poser problème?? [/Edit]

  2. #2
    Membre Expert Avatar de jabbounet
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Juin 2009
    Messages
    1 909
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Juin 2009
    Messages : 1 909
    Par défaut
    A lire, petit article sur l'utilisation du singleton en environnement multi-thread.

    http://christophej.developpez.com/tu...n/multithread/

  3. #3
    Membre éclairé Avatar de GyZmoO
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    428
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Février 2006
    Messages : 428
    Par défaut
    Salut et merci pour ta réponse.

    Je viens de lire ton article (très intéressant), beaucoup de choses que j'ignorais... (le DCL notamment et le pourquoi du comment il ne fonctionne pas)

    Si j'ai saisi, la définition de la méthode getInstance() de mon singleton est correcte étant donné qu'elle est synchronisée. (Reste le cas des perfos, mais dans mon cas, ce n'est pas le plus prioritaire).

    En fait ce singleton, possède le "savoir" en termes de travaux à distribuer à tous les Threads. (Il possède des maps, lists etc... contenant des informations nécessaires au bon déroulement des travaux par les autres threads).

    Bref ce code est dans une application en production, (et évidemment on se fait taper sur les doigts parce que le thread qui se 'bloque', n'exécute pas les travaux qu'il a à faire...).

    J'ai jamais constaté un tel phénomène, le plus ahurissant c'est qu'il peut rester des heures entières bloqué (le thread...).

    Je ne comprend pas, pourquoi la Jvm ne lui rend pas la priorité (10 Threads qui tapent dans le singleton, ok, mais qd même l'autre reste bloqué des heures...).

    Et puis après, il reprend sa vie comme si de rien n'était...

    Entre threads de même priorité, je pensais que le plus vieux en terme d'attente était réveillé en 1er...

  4. #4
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 582
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 582
    Par défaut
    Citation Envoyé par GyZmoO Voir le message
    Je ne comprend pas, pourquoi la Jvm ne lui rend pas la priorité (10 Threads qui tapent dans le singleton, ok, mais qd même l'autre reste bloqué des heures...).
    Pourquoi pas ? Personne ne lui demande de faire ça.

    Citation Envoyé par GyZmoO Voir le message
    Entre threads de même priorité, je pensais que le plus vieux en terme d'attente était réveillé en 1er...
    C'est vrai qu'on pourrait le penser, oui... Mais en fait non. Si tu veux ça, tu dois implémenter une queue. Sinon la JVM (l'OS, en fait,) considère pas que c'est forcément ça que tu veux.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  5. #5
    Membre éclairé Avatar de GyZmoO
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    428
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Février 2006
    Messages : 428
    Par défaut
    Salut et merci pour vos réponses.

    Bon ben je pense que je vais implémenter une file, et le tour sera joué va.


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

Discussions similaires

  1. Souci JDBC avec Mysql, programmation JAVA
    Par Danzel dans le forum Windows
    Réponses: 8
    Dernier message: 29/12/2006, 21h46
  2. Souci JDBC avec Mysql, programmation JAVA
    Par Danzel dans le forum JDBC
    Réponses: 1
    Dernier message: 16/12/2006, 09h31
  3. Réponses: 2
    Dernier message: 02/02/2006, 23h00

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