Est java.util.Hashtable "thread-safe"?
Il a été un moment depuis que j'ai utilisé de la table de hachage pour quelque chose de significatif, mais il me semble que le get() et() les méthodes en cours de synchronisation.
La Javadoc de ne pas tenir compte de cela. Ils ont simplement dire que la classe Hashtable est synchronisé. Que puis-je assumer? Si plusieurs threads accèdent à la table de hachage en même temps (en supposant qu'ils ne modifient pas la même entrée), les opérations de réussir, non? Je suppose que ce que je vous pose est "Est java.util.Hashtable "thread-safe"?"
Merci de me Guider pour sortir de ce problème...
download.oracle.com/javase/7/docs/api/java/util/Hashtable.html
Citation du lien ci-dessus - à la différence de la nouvelle collection les implémentations de la table de hachage est synchronisé. Si un thread-safe mise en œuvre n'est pas nécessaire, il est recommandé d'utiliser une table de hachage en place de la table de hachage. Si un thread-safe hautement parallèles de mise en œuvre est souhaitée, il est recommandé d'utiliser ConcurrentHashMap en place de la table de hachage.
Citation du lien ci-dessus - à la différence de la nouvelle collection les implémentations de la table de hachage est synchronisé. Si un thread-safe mise en œuvre n'est pas nécessaire, il est recommandé d'utiliser une table de hachage en place de la table de hachage. Si un thread-safe hautement parallèles de mise en œuvre est souhaitée, il est recommandé d'utiliser ConcurrentHashMap en place de la table de hachage.
OriginalL'auteur Saravanan | 2011-09-13
Vous devez vous connecter pour publier un commentaire.
Il est thread-safe, parce que le get, put, contient des méthodes, etc sont synchronisés. En outre, Plusieurs threads ne seront pas en mesure d'accéder à la table de hachage dans le même temps, indépendamment de qui les entrées qu'ils sont en train de modifier.
modifier modifiée pour inclure les en o que la synchronisation rend la table de hachage interne des threads en ce qu'elle est modifiée de manière atomique, il n'a pas la garde contre des conditions de course en dehors du code causés par l'accès simultané à la table de hachage par plusieurs threads.
Je suis d'accord avec vous et d'autres qui ont fait cela; tous les synchronisée n'est limiter les modifications à un seul thread à la fois, de vérifier si les résultats sont sain d'esprit est toujours en place pour le programmeur.
OriginalL'auteur mcfinnigan
À un usage général, il est thread-safe.
Mais vous devez comprendre qu'il doesent faire de la logique de l'application autour d'elle thread-safe. Pour, par exemple, envisager de mettre en œuvre pour mettre une valeur dans une carte, si elle n'est pas déjà là.
Ce langage est appelé putIfAbsent. Il est difficile de l'appliquer dans un thread de manière sûre à l'aide de la table de hachage seul. De même pour l'idiome remplacer(k,V,V).
Donc pour certains idiomes comme putIfAbsent et et remplacer(K,V,V), je vous conseille d'utiliser ConcurrentHashMap
OriginalL'auteur Suraj Chandran
Table de hachage est obsolète. L'oublier. Si vous souhaitez utiliser synchronisé des collections, de l'utilisation des Collections.syncrhonize*() wrapper pour cette fin. Mais ceux-ci ne sont pas recommandés. En Java 5, 6 nouvelles concurrentes des algorithmes ont été mis en œuvre. Copy-on-write, numéro de CAS, les algorithmes sans verrouillage.
Pour la Carte d'interface il y a deux implémentations concurrentes. ConcurrentHashMap (concurrent de hachage à la carte) et ConcurrentSkipListMap simultané triés carte implementaion.
Le premier est optimisé pour la lecture, de sorte que les récupérations de ne pas bloquer, alors même que le tableau est mis à jour. Les écritures sont également de travailler beaucoup plus vite en comparant avec synchronisation des wrappers de provoquer un ConcurrentHashMap se compose non pas d'une, mais un ensemble de tables, appelées segments. Il peut être géré par le dernier argument du constructeur:
ConcurrentHashMap est indispensable dans de très simultanées contextes, où il effectue beaucoup mieux que toute autre.
OriginalL'auteur Alexandr
Oui Hashtable est thread-safe, Si un thread-safe n'est pas nécessaire dans votre application, puis aller à travers la table de hachage, Au cas où, Si un thread-safe de la mise en œuvre est souhaitée,il est recommandé d'utiliser ConcurrentHashMap en place de la table de hachage.
OriginalL'auteur subodh
Noter qu'un grand nombre de réponses de l'état que la table de hachage est synchronisé. mais cela vous donnera un peu. La synchronisation est sur l'accesseur /mutateur méthodes d'arrêter les deux fils de l'ajout ou de la suppression de la carte simultanément, mais dans le monde réel, vous aurez souvent besoin de plus de synchronisation.
Même itération sur les entrées d'une table de hachage n'est pas thread-safe, sauf si vous aussi vous garde la Carte d'être modifié par l'ajout de la synchronisation.
OriginalL'auteur Umesh Awasthi
Pas. Il est 'threads' seulement dans la mesure où ses méthodes sont synchronisés. Cependant, il n'est pas thread-safe en général, et il ne peut pas être, parce que les classes qu'à l'exportation des états internes tels que les Itérateurs ou des Énumérations nécessitent l'utilisation de l'état interne d'être synchronisées. C'est pourquoi les nouvelles Collections, les classes sont pas synchronisés, comme le Java concepteurs reconnu que le fil de sécurité est à l'utilisateur de la classe, et non la classe elle-même.
des threads c'est faux. Hashtable est thread-safe et il utilise
Enumerator
et pasIterator
.Non, il n'est pas thread-safe, pour la raison que j'ai donné, et j'ai dit 'comme'.
OriginalL'auteur user207421
Si vous regardez dans la table de hachage code, vous verrez que les méthodes sont synchronisés tels que:
Vous pouvez continuez à appuyer sur la touche control (commande de mac) et cliquez ensuite sur un nom de méthode dans l'éclipse pour aller au code source java.
OriginalL'auteur celik
À la différence de la nouvelle collection implémentations, table de hachage est synchronisé. *Si un thread-safe mise en œuvre n'est pas nécessaire, il est recommandé d'utiliser une HashMap* à la place de la table de hachage. Si un thread-safe hautement parallèles de mise en œuvre est souhaitée, il est recommandé d'utiliser ConcurrentHashMap en place de la table de hachage.
http://download.oracle.com/javase/7/docs/api/java/util/Hashtable.html
OriginalL'auteur Rollyng
Oui, Hashtable thread-safe, donc un seul thread peut accéder à une table de hachage à tout moment
Table de hachage, de l'autre côté, n'est pas thread-safe (et donc "plus vite").
OriginalL'auteur Augusto