Java error java.util.ConcurrentModificationException: causas e soluções nulas

Java error java.util.ConcurrentModificationException: causas e soluções nulas

Introdução:

Na programação Java, ao usar iteradores ou loops for aprimorados para percorrer coleções ou mapas, às vezes você pode encontrar java.util.ConcurrentModificationException: exceções nulas. Essa exceção geralmente ocorre em um ambiente multiencadeado, o que significa que a estrutura da coleção ou mapa mudou durante o processo de iteração. Este blog analisará a causa dessa exceção para você e fornecerá as soluções correspondentes.

Motivo anormal:

java.util.ConcurrentModificationException: exceções nulas geralmente são causadas por:

  • Durante a iteração, a coleção ou mapa foi modificado de forma incorreta. Por exemplo, ao usar um iterador para percorrer um ArrayList, a estrutura do ArrayList é modificada em outro thread ao mesmo tempo, como adicionar ou excluir elementos.
  • No processo de iteração, o método remove() da coleção ou mapa é usado diretamente em vez do método remove() do iterador. O uso direto do método remove() de uma coleção ou mapa fará com que o estado do iterador seja anormal, acionando assim uma ConcurrentModificationException.
  • Múltiplos threads operam na mesma coleção ou mapa simultaneamente sem medidas de sincronização apropriadas.

solução:

Pelas razões anormais acima, seguem algumas sugestões de soluções:

  • Use o método remove() do iterador para remover elementos de uma coleção ou mapa. O método remove() do iterador é o único que pode remover elementos com segurança durante a iteração.
  • Certifique-se de tomar as medidas de sincronização apropriadas ao manipular coleções ou mapas em um ambiente multiencadeado. Você pode usar a palavra-chave sincronizada ou classes de coleção simultâneas (como ConcurrentHashMap) para garantir a segurança do encadeamento.
  • Se você precisar modificar a estrutura da coleção ou do mapa durante a iteração, considere o uso de métodos relacionados de iteradores, como os métodos add() ou set().
    Código de exemplo:
    o seguinte é um código de exemplo que percorre um ArrayList usando um iterador para demonstrar como lidar adequadamente com ConcurrentModificationException:
List<String> list = new ArrayList<>();
list.add("item1");
list.add("item2");
list.add("item3");

Iterator<String> iterator = list.iterator();
while (iterator.hasNext()) {
    
    
    String item = iterator.next();
    System.out.println(item);

    // 在迭代过程中添加或者删除元素
    iterator.remove();
}

para concluir:

Quando ocorre uma exceção java.util.ConcurrentModificationException: null durante a iteração, significa que a estrutura da coleção ou mapa foi alterada. Esse problema pode ser efetivamente resolvido usando métodos iteradores adequados, medidas de sincronização e evitando modificar diretamente a estrutura da coleção ou mapa. Isso garante a operação segura de coleções ou mapas em um ambiente multiencadeado, evitando exceções de ConcurrentModificationException. O foco está em operações assíncronas multiencadeadas.

おすすめ

転載: blog.csdn.net/weixin_45626288/article/details/131724418