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

  1. #1
    Nouveau membre du Club
    Inscrit en
    Mars 2004
    Messages
    26
    Détails du profil
    Informations forums :
    Inscription : Mars 2004
    Messages : 26
    Points : 28
    Points
    28
    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 éclairé Avatar de remika
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    806
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 806
    Points : 861
    Points
    861
    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
    Ignorer c'est aussi croire que l'on sait.
    Merci d'essayer d'écrire correctement.
    Pas de questions techniques par MP SVP.

  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
    Points : 3 080
    Points
    3 080
    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
    Nouveau membre du Club
    Inscrit en
    Mars 2004
    Messages
    26
    Détails du profil
    Informations forums :
    Inscription : Mars 2004
    Messages : 26
    Points : 28
    Points
    28
    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 éclairé Avatar de remika
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    806
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 806
    Points : 861
    Points
    861
    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.
    Ignorer c'est aussi croire que l'on sait.
    Merci d'essayer d'écrire correctement.
    Pas de questions techniques par MP SVP.

  6. #6
    Nouveau membre du Club
    Inscrit en
    Mars 2004
    Messages
    26
    Détails du profil
    Informations forums :
    Inscription : Mars 2004
    Messages : 26
    Points : 28
    Points
    28
    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

  7. #7
    Membre émérite
    Avatar de gifffftane
    Profil pro
    Inscrit en
    Février 2007
    Messages
    2 354
    Détails du profil
    Informations personnelles :
    Localisation : France, Loire (Rhône Alpes)

    Informations forums :
    Inscription : Février 2007
    Messages : 2 354
    Points : 2 582
    Points
    2 582
    Par défaut
    Il y a deux approches.

    Soit tu laisses l'accès relativement libre aux SM et TM, et alors tu dois mettre en oeuvre, depuis l'extérieur, une sorte de discipline d'accés. Elle peut consister à ce que chaque thread se synchronise sur un même objet. Cet objet lock pourra être fourni par C ou par D. La discipline peut aussi consister à réserver un thread pour les accés concurrents.

    Cette première approche, par discipline externe, est un peu l'approche de swing, par exemple ; dans le paquetage java.util.concurrent il y a des choses pour en faciliter la mise en oeuvre. Mais cette approche nécessite que tout le monde veuille bien - ou puisse - respecter la discipline. Je ne sais pas si c'est ton cas.

    La deuxième approche est de poser la discipline à l'intérieur de l'objet accédé. Comme ici il y en a deux, il faut placer le service dans un objet qui les encapsule. D'après ton schéma, ce serait D.

    Cependant, dans cette approche, il faut que l'encapsulation soit complète. S'il est possible d'accéder à SM ou à TM par d'autres voies que D, ou même de les manipuler sans que D ne le sache, alors il ne sera pas possible de faire une synchronisation correcte.

    Quelle approche te semble-t-il la plus jouable ?
    Mieux que Google, utilisez Sur Java spécialisé sur la plate-forme java !
    Pour réaliser vos applications Java dans le cadre de prestations, forfait, conseil, contactez-moi en message privé.

  8. #8
    Nouveau membre du Club
    Inscrit en
    Mars 2004
    Messages
    26
    Détails du profil
    Informations forums :
    Inscription : Mars 2004
    Messages : 26
    Points : 28
    Points
    28
    Par défaut
    La seconde approche me semble plus adaptée. Pour acceder aux TM et SM, on passe par D. Il faudrait que j'implemente un semaphore dans D qui permette de retourner un TM ou SM comme il le faudrait.

    Heureusement que ce n'est pas un bug urgent, ca me laissera le temps de bien penser a tout ca.

    Merci a tous

+ 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