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     }        
  • 相关阅读:
    LG P3975 [TJOI2015]弦论
    LG P5056 【模板】插头dp
    LG P5279 [ZJOI2019]麻将
    BZOJ3864 Hero meet devil
    [NOIP模拟]相遇/行程的交集
    LG P3196 [HNOI2008]神奇的国度
    LG P3312 [SDOI2014]数表
    python pip 安装包的时候出现的各种错误。一句话解决。
    CTF入门
    Pythoncharm安装
  • 原文地址:https://www.cnblogs.com/try4396/p/12131990.html
Copyright © 2011-2022 走看看