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 }