O método forEach de ConcurrentHashMap é thread-safe? [duplicado]
Se quiser iterar sobre todos os elementos em ConcurrentHashMap, o forEach
método é thread-safe?
Respostas
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
forEach
chamada, então sim, é thread-safe. - Se você quiser que o mapa não possa ser modificado enquanto
forEach
estiver 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.