No javadoc para ConcurrentHashMap, é o seguinte:
As operações de recuperação (incluindo get) geralmente não são bloqueadas, portanto, podem se sobrepor às operações de atualização (incluindo colocar e remover). As recuperações refletem os resultados das operações de atualização concluídas mais recentemente, mantidas após o início. Para operações agregadas, como putAll e clear, as recuperações simultâneas podem refletir a inserção ou remoção de apenas algumas entradas. Da mesma forma, Iteradores e Enumerações retornam elementos que refletem o estado da tabela de hash em algum momento na ou desde a criação do iterador / enumeração. Eles não lançam ConcurrentModificationException. No entanto, os iteradores são projetados para serem usados por apenas um encadeamento por vez.
O que isso significa? O que acontece se eu tentar iterar o mapa com dois threads ao mesmo tempo? O que acontece se eu colocar ou remover um valor do mapa enquanto o iterar?
ConcurrentModificationException
tempo repetindo aConcurrentHashMap
, por quê?Você pode usar esta classe para testar dois threads de acesso e um mutando a instância compartilhada de
ConcurrentHashMap
:Nenhuma exceção será lançada.
Compartilhar o mesmo iterador entre os segmentos do acessador pode levar a um conflito:
Assim que você começar a compartilhar o mesmo
Iterator<Map.Entry<String, String>>
entre threads de acessador e mutadorjava.lang.IllegalStateException
, começará a aparecer.fonte
Isso significa que você não deve compartilhar um objeto iterador entre vários encadeamentos. Criar vários iteradores e usá-los simultaneamente em threads separados é bom.
fonte
Isso pode lhe dar uma boa ideia
Em relação a este:
Isso significa que, embora o uso de iteradores produzidos pelo ConcurrentHashMap em dois threads seja seguro, isso pode causar um resultado inesperado no aplicativo.
fonte
Isso significa que você não deve tentar usar o mesmo iterador em dois threads. Se você tiver dois threads que precisam iterar sobre as chaves, valores ou entradas, cada um deles deve criar e usar seus próprios iteradores.
Não está totalmente claro o que aconteceria se você quebrasse essa regra. Você poderia obter um comportamento confuso, da mesma maneira que faria se (por exemplo) dois threads tentassem ler da entrada padrão sem sincronizar. Você também pode obter um comportamento não thread-safe.
Mas se os dois threads usaram iteradores diferentes, você deve estar bem.
Essa é uma questão separada, mas a seção javadoc que você citou responde adequadamente. Basicamente, os iteradores são seguros para threads, mas não está definido se você verá os efeitos de inserções, atualizações ou exclusões simultâneas refletidas na sequência de objetos retornados pelo iterador. Na prática, provavelmente depende de onde no mapa as atualizações ocorrem.
fonte