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     }        
原文地址:https://www.cnblogs.com/try4396/p/12131990.html