Je suis vraiment confus sur la façon dont ces 2 collections se comportent dans un environnement multithread. p>
La table de hachage est synchronisée, ce qui signifie que aucun threads de 2 2 met fin à sa valeur simultanément à droite? P>
5 Réponses :
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. P>
HASHMAP n'est pas synchronisé, il est donc plus rapide, mais vous pouvez avoir un problème dans un environnement multi-thread. P>
regarde Concourshashmap a > s pour les cartes de sécurité du fil. P>
Ils offrent toutes les caractéristiques de la haquetable avec une performance très proche d'un hashmap. p>
Les performances sont gagnées au lieu d'utiliser une serrure large cartographique, la collection conserve une liste de 16 verrouilles par défaut, chacune étant utilisée pour verrouiller un seul godet de la carte. Vous pouvez même configurer le nombre de godets :) modifier cela peut aider les performances en fonction de vos données. P>
Je ne peux pas recommander assez de simultanence Java dans la pratique par Brian Goetz
http://jcip.net/ p>
J'apprends toujours quelque chose de nouveau à chaque fois que je le lis. p>
Oui, toutes les méthodes sont effectuées atomiquement, mais les valeurs () ne sont pas (voir 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. P>
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 i> 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 i>. 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).
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. P>
Un niveau similaire de synchronisation peut être obtenu pour les hachams en appelant: p> 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. P> Comme Paul dit, ConcurrenthashMaps fournit des cartes de sécurité sur des méthodes utiles supplémentaires pour les mises à jour atomiques. P> P>
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.
Notez également que Hashtable et Par exemple, vous ne pouvez pas écrire l'une des méthodes suivantes sans verrouillage supplémentaire: p>
Échangez les valeurs à deux clés différentes: Ajoutez le paramètre à valoriser à une touche: Et oui, tout cela est couvert dans JCIP: -) p> Collections.SynchronizedMap CODE> 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 em> le verrouillage du côté client supplémentaire sera nécessaire. P>
SwapValues (carte, objet K1, Objet K2) Code> P> LI>
APPENDTALUE (carte, objet K1, SUPPLIX) CODE> P> LI>
ul>
ConcurrentMap CODE> ajoute quelques méthodes très utiles à
Carte Code>.