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 :

blocage sur une méthode synchronized


Sujet :

Java

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2005
    Messages : 7
    Points : 12
    Points
    12
    Par défaut blocage sur une méthode synchronized
    Bonjour,

    Je suis fait face à une situation étonnante : Je lance deux applications java distinctes de manière à ce qu'elles accèdent quasi simultanément à une méthode synchronized (appelons la METH).

    Application A appelle METH chez B (via corba)
    Application B appelle METH chez A (via corba)

    On ne devrait donc meme pas avoir des threads concurrents vu qu'elles appellent la méthode dans des applications différentes (a des endroits différentes, système distribué). Bref, lorsque j'appelle METH comme expliqué ci dessus simultanément (ou quasi), la première instruction de METH (System.err.println) ne s'execute meme pas! Les deux applications attendent à l'entrée...

    Je fais aussi un System.err.println juste avant l'appel de METH et la ca s'affiche. Donc j'en conclus qu'elles attendent toutes les deux à l'entrée de METH plutot que d'en laisser passer une puis l'autre.

    Quelqu'un a une idée?

  2. #2
    Membre confirmé Avatar de billynirvana
    Homme Profil pro
    Architecte technique
    Inscrit en
    Décembre 2004
    Messages
    472
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Architecte technique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2004
    Messages : 472
    Points : 552
    Points
    552
    Par défaut
    Par ce que je lis, je peux juste qui que c'est vague d'annoncer qu'elles sont bloquées à cause du synchronized. De plus, si j'ai bien compris, elles n'utilisent pas la même ressource critique, car A et B sont 2 instances différentes.

    Je pense que l'erreur vient d'ailleurs.

    Pour vérifier l'utilisation de la ressource critique et du synchronized d'une methode du controleur C, il faut que C soit appelé de manière quasi-simultanée par A et par B .

    Enfin, ce message est basée sur mes souvenirs d'université...


    Ca m'interesse ce sujet!

  3. #3
    Membre régulier
    Développeur informatique
    Inscrit en
    Mars 2005
    Messages
    110
    Détails du profil
    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mars 2005
    Messages : 110
    Points : 106
    Points
    106
    Par défaut
    Salut,
    Juste par curiosité:
    Il s'agit bien de la même application Foo.jar, mais une tourne sur A et l'autre sur B, et un objet sur chaque machine appelle Bar.Meth() sur l'autre:
    - Ta médhode METH est elle statique?

    J'ai aucune idée mais j'essaie de piger.. pour voir si je me souviens de quelque chose de l'automne dernier

  4. #4
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2005
    Messages : 7
    Points : 12
    Points
    12
    Par défaut Solution...
    En fait j'ai fini par touver.

    Il faut savoir qu'un synchronized a un effet sur toute la classe... et que j'avais plusieurs méthodes synchronized.

    Posons deux méthodes synchronized :
    meth1() et meth2()

    Et lancons deux fois l'application : A et B

    Dans meth1() je fais un appel indirect au meth2() de l'autre application et j'attends que meth2() soit exécutée pour continuer.

    Donc A est dans meth1() coté A, et invoque meth2() coté B
    B est dans meth1() coté B et il empeche l'acces à meth2() coté B.
    Le problème est le meme dans l'autre sens... on a donc un deadlock!!

    A cause du synchronized, tant que meth1() est occupée dans une application, on ne sait pas accéder aux autre méthodes synchronized de la meme classe (et de la meme application).

    Voila, merci pour votre intervention.

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

Discussions similaires

  1. un "synchronized" sur une méthode
    Par l'unique dans le forum Débuter avec Java
    Réponses: 8
    Dernier message: 23/05/2011, 20h30
  2. [68HC11] Blocage sur une boucle
    Par paterson dans le forum Autres architectures
    Réponses: 3
    Dernier message: 10/11/2006, 20h45
  3. [VBA] information sur une méthode
    Par stolx_10 dans le forum Access
    Réponses: 27
    Dernier message: 19/09/2006, 17h27
  4. [ActiveX] Retour de BSTR sur une méthode externe
    Par mr.saucisse dans le forum MFC
    Réponses: 28
    Dernier message: 11/01/2006, 15h47
  5. Réponses: 3
    Dernier message: 16/04/2004, 16h51

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