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 :

[Thread] Synchroniser tous les éléments d'une map


Sujet :

Concurrence et multi-thread Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Mars 2004
    Messages
    26
    Détails du profil
    Informations forums :
    Inscription : Mars 2004
    Messages : 26
    Par défaut [Thread] Synchroniser tous les éléments d'une map
    Bonjour,

    Voici le diagramme de classes que j'ai fait avec Visio.


    J'ecris une méthode de la classe C.

    Cette classe C contient une map avec pour clé une String et comme valeur un objet de type D.

    La classe D contient un SM et un TM qui sont utilisés par d'autres threads (de type autres que C et D). Des mutex (par synchronized) peuvent etre poses sur SM et TM par ces autres threads.

    J'ai besoin de verouiller tous les TM et SM (en meme temps ou les uns apres les autres) de tous les D qui sont dans C dans la methode que je suis en train d'écrire.
    Grosso modo, j'aimerai pouvoir faire, lorsque je parcours tous les D de la map, l'equivalent de blocs synchronized (element_de_la_map_de_D) qui puissent s'imbriquer.

    Mes contraintes :
    • Je n'ai pas le droit de verouiller C ou D (pour des soucis de deadlocks ).
    • Je n'ai pas le droit de modifier le diagramme. Mais je peux rajouter des attributs dans les classes ou des nouvelles classes en plus.


    J'ai cherché un peu partout sur le net avec Google et dans un livre (Java in a nutshell) mais on ne verouille qu'un seul objet.

    Je sais que la conception est tres tres mauvaise (ce n'est pas moi qui l'ai faite ) mais je suis quand meme bien coincé.

    Merci d'avance

  2. #2
    Membre émérite Avatar de remika
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    806
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 806
    Par défaut
    J'ai pas tout compris, mais dans Collections ya une méthode qui s'appelle synchronizedMap. Je sais pas si c'est ce que tu cherches ou si je suis à côté de la plaque

  3. #3
    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
    à chaque fois tu ne renvoies pas la map, mais tu la recopies dans un bloc locké dans une autre map (new HashMap<?,?>(taMap)) que tu retournes, et celle-ci peut être utilisée en dehors de tout verrou...

  4. #4
    Membre averti
    Inscrit en
    Mars 2004
    Messages
    26
    Détails du profil
    Informations forums :
    Inscription : Mars 2004
    Messages : 26
    Par défaut
    Pour etre plus clair C a une map<String, D>.

    Ce n'est pas la map que je voudrais synchroniser mais les elements (le TM et SM de chaque D de la map) qu'elle contient. Le but est de verrouiller, depuis C, tous les TM et SM afin de travailler dessus sans que les autres threads ne puissent les modifier.

  5. #5
    Membre émérite Avatar de remika
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    806
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 806
    Par défaut
    Tu ajoutes un boolean locked dans tes TM et SM, au moment où tu as besoin de la map tu mets ce boolean à true dans tous les TM et TS des D de la Map (parcours classique des values). Tu fais en sorte que tes Thread ne puissent plus toucher aux SM et TM si locked est à true.
    Le problème persiste si des Thread accèdent déjà aux SM ou TM au moment où tu utilises ta Map, auquel cas il faudrait un autre boolean pour savoir qu'un Thread utilise la resssource, voire un int pour savoir le nombre de Threads l'utilisant, et attendre que cette valeur s'annule pour pouvoir locker depuis C.

  6. #6
    Membre averti
    Inscrit en
    Mars 2004
    Messages
    26
    Détails du profil
    Informations forums :
    Inscription : Mars 2004
    Messages : 26
    Par défaut
    Je pensais pas avoir une reponse dans la nuit

    J'ai pensé a faire ce que tu m'as proposé (un sémaphore, si je ne me trompe pas). Je pense qu'il n'y a pas d'autres solutions.

    La nuit porte conseil, si je trouve pas autre chose, je le mettrai en resolu demain

    Merci

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

Discussions similaires

  1. Réponses: 1
    Dernier message: 19/02/2010, 18h41
  2. Réponses: 6
    Dernier message: 06/01/2009, 21h01
  3. Comment tester si tous les éléments d'une page ont été chargés ?
    Par Gat- dans le forum Général JavaScript
    Réponses: 5
    Dernier message: 15/02/2007, 13h19
  4. Appliquer un style à tous les éléments d'une table
    Par licorne dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 02/01/2007, 14h31
  5. [code] Comment lister tous les éléments d'une form
    Par LE NEINDRE dans le forum Général JavaScript
    Réponses: 5
    Dernier message: 16/10/2006, 11h23

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