8
votes

Hashmap et Hashtable dans un environnement multithread

Je suis vraiment confus sur la façon dont ces 2 collections se comportent dans un environnement multithread.

La table de hachage est synchronisée, ce qui signifie que aucun threads de 2 2 met fin à sa valeur simultanément à droite?


0 commentaires

5 Réponses :


3
votes

Exactement, la hache est synchronisée qui signifie qu'il est prudent de l'utiliser dans un environnement multi-thread (de nombreux threads accédant à la même haquetable) si deux threads essaient de mettre à jour la haquetable au Sametime, l'un d'entre eux devra attendre que le autre thread finir sa mise à jour.

HASHMAP n'est pas synchronisé, il est donc plus rapide, mais vous pouvez avoir un problème dans un environnement multi-thread.


0 commentaires


0
votes

Oui, toutes les méthodes sont effectuées atomiquement, mais les valeurs () ne sont pas (voir Docs ).

Paul était plus rapide que moi vous recommandant du package Java.Util.ConCurrent, qui vous donne une très bonne commande et des structures de données pour les environnements multithreade.


3 commentaires

Le problème ne surviendra que si nous avons des variables d'instance non? Avec les variables déclarées et utilisées à l'intérieur de la signature de méthode n'auront pas de problèmes dans l'environnement multithread. S'il vous plaît corriger si mal.


Les problèmes peuvent survenir plus vite avec des variables d'instance, mais ce n'est pas le problème. Le problème consiste à partager des variables sans aucun type de Control . J'utilise un concours statique sans problèmes (je suis absolument d'accord avec la réponse de Paul) :)


Le paramètre d'un appel de méthode ou d'un constructeur peut ne pas être une variable d'instance (ni de classe).



0
votes

Les hashables sont synchronisées mais elles sont une vieille implémentation que vous pourriez presque dire est obsolète. En outre, ils n'autorisent pas les touches nulles (peut-être pas des valeurs nulles non plus non plus? Pas sûr).

Un problème est que, bien que chaque appel est synchronisé, les actions les plus intéressantes nécessitent plus d'un appel afin que vous puissiez vous synchroniser autour des plusieurs Appels.

Un niveau similaire de synchronisation peut être obtenu pour les hachams en appelant: xxx

qui enveloppe une carte dans des appels de méthode synchronisée. Mais cela a les mêmes inconvénients de la concurrence que la catastiche.

Comme Paul dit, ConcurrenthashMaps fournit des cartes de sécurité sur des méthodes utiles supplémentaires pour les mises à jour atomiques.


1 commentaires

Les hashables ne sont pas encore obsolètes (pas sûres pourquoi), mais l'interface de dictionnaire qu'ils mettent en œuvre sont considérées comme obsolètes.



3
votes

Notez également que Hashtable et Collections.SynchronizedMap ne sont sécurisés que pour les opérations individuelles. Toutes les opérations impliquant plusieurs clés ou chèques-ALL-ACT qui doivent être atomiques seront pas le verrouillage du côté client supplémentaire sera nécessaire.

Par exemple, vous ne pouvez pas écrire l'une des méthodes suivantes sans verrouillage supplémentaire:

  • Échangez les valeurs à deux clés différentes: SwapValues ​​(carte, objet K1, Objet K2)

  • Ajoutez le paramètre à valoriser à une touche: APPENDTALUE (carte, objet K1, SUPPLIX)

    Et oui, tout cela est couvert dans JCIP: -)


1 commentaires

ConcurrentMap ajoute quelques méthodes très utiles à Carte .