La méthode forEach de ConcurrentHashMap est-elle thread-safe? [dupliquer]
Si vous souhaitez parcourir tous les éléments de ConcurrentHashMap, utilisez-vous la forEach
méthode thread-safe?
Réponses
Cela dépend de ce que vous entendez par thread-safe.
- Si vous êtes d'accord pour que d'autres threads puissent modifier la carte pendant que vous êtes au milieu d'un
forEach
appel, alors oui, c'est thread-safe. - Si vous voulez que la carte ne soit pas modifiable pendant qu'elle
forEach
est en cours de sorte que d'autres threads soient bloqués ou en erreur s'ils tentent de le modifier, non, ce n'est pas le cas.
La documentation de l'API dit:
Cependant, même si toutes les opérations sont thread-safe, les opérations de récupération n'impliquent pas de verrouillage et il n'y a aucune prise en charge pour verrouiller la table entière d'une manière qui empêche tout accès.
...
De même, les itérateurs, les séparateurs et les énumérations renvoient des éléments reflétant l'état de la table de hachage à un moment donné ou depuis la création de l'itérateur / énumération. Ils ne lancent pas
ConcurrentModificationException
... Gardez à l'esprit que les résultats des méthodes de statut agrégé ... ne sont généralement utiles que lorsqu'une carte ne subit pas de mises à jour simultanées dans d'autres threads. Sinon, les résultats de ces méthodes reflètent des états transitoires qui peuvent être adéquats à des fins de surveillance ou d'estimation, mais pas pour le contrôle du programme.