La méthode forEach de ConcurrentHashMap est-elle thread-safe? [dupliquer]

Jan 05 2021

Si vous souhaitez parcourir tous les éléments de ConcurrentHashMap, utilisez-vous la forEachméthode thread-safe?

Réponses

1 JohnKugelman Jan 05 2021 at 11:08

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 forEachappel, alors oui, c'est thread-safe.
  • Si vous voulez que la carte ne soit pas modifiable pendant qu'elle forEachest 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.