O método forEach de ConcurrentHashMap é thread-safe? [duplicado]

Jan 05 2021

Se quiser iterar sobre todos os elementos em ConcurrentHashMap, o forEachmétodo é thread-safe?

Respostas

1 JohnKugelman Jan 05 2021 at 11:08

Depende do que você entende por thread-safe.

  • Se você concordar que outras threads podem modificar o mapa enquanto você está no meio de uma forEachchamada, então sim, é thread-safe.
  • Se você quiser que o mapa não possa ser modificado enquanto forEachestiver em andamento, de forma que outras threads sejam bloqueadas ou apresentem erros se tentarem modificá-lo, não, não é.

A documentação da API diz:

No entanto, mesmo que todas as operações sejam thread-safe, as operações de recuperação não implicam em bloqueio e não há suporte para bloquear a tabela inteira de uma forma que impeça todo o acesso.

...

Da mesma forma, Iteradores, Divisores e Enumerações retornam elementos que refletem o estado da tabela hash em algum ponto durante ou desde a criação do iterador / enumeração. Eles não jogam ConcurrentModificationException... Lembre-se de que os resultados dos métodos de status agregado ... são normalmente úteis apenas quando um mapa não está passando por atualizações simultâneas em outros threads. Caso contrário, os resultados desses métodos refletem estados transitórios que podem ser adequados para fins de monitoramento ou estimativa, mas não para controle de programa.