zoukankan      html  css  js  c++  java
  • ConcurrentModificationException

     1 package Day15;
     2 
     3 import java.util.ArrayList;
     4 import java.util.List;
     5 
     6 public class P01RemoveHero {
     7 
     8     public static void main(String[] args) {
     9         // TODO Auto-generated method stub
    10         List<Hero> heros = new ArrayList<>();
    11         
    12         for (int i = 0; i < 100; i++) {
    13             heros.add(new Hero("hero" + i, i));            
    14         }
    15         
    16         System.out.println(heros);
    17         
    18         for (Hero hero : heros) {//此处报错
    19             if(hero.getNum()%8==0);
    20             heros.remove(hero.getNum());
    21         }
    22     }
    23 
    24 }

    问题描述:在使用Iterator迭代器遍历时,同时用使用remove()方法进行了删除的操作会导致并发修改异常。

    原因:Iterator 是工作在一个独立的线程中,并且拥有一个 mutex 锁。 Iterator 被创建之后会建立一个指向原来对象的单链索引表,当原来的对象数量发生变化时,这个索引表的内容不会同步改变。当索引指针往后移动的时候就找不到要迭代的对象。所以发生报错。

    解决方案:直接使用迭代器的remove()方法即可

    改正后:

    1     Iterator<Hero> h = heros.iterator(); //18行    
    2     while(h.hasNext()) {
    3         Hero hero = h.next();
    4         if(hero.getNum()%8==0)
    5             h.remove();
    6     }        
  • 相关阅读:
    unity代码加密for Android,mono编译
    php __invoke 和 __autoload
    VC只运行一个程序实例
    VC单文档对话框添加托盘图标
    技术文档应该怎么写
    项目管理学习
    cannot download, /home/azhukov/go is a GOROOT, not a GOPATH
    Go语言学习
    appium键盘事件
    appium-doctor
  • 原文地址:https://www.cnblogs.com/try4396/p/12131990.html
Copyright © 2011-2022 走看看