欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

java.util.ConcurrentModificationException 异常

程序员文章站 2022-05-23 11:41:59
...

在对Vector、ArrayList做迭代的时候如果同时对其进行修改就会抛出java.util.ConcurrentModificationException异常。

--注:像使用for-each进行迭代实际上也会出现这种问题。

 

public class Test {
    public static void main(String[] args)  {
        ArrayList<Integer> list = new ArrayList<Integer>();
        list.add(2);
        Iterator<Integer> iterator = list.iterator();
        while(iterator.hasNext()){
            Integer integer = iterator.next();
            if(integer==2)
                list.remove(integer);
        }
    }
}

 

运行结果:

java.util.ConcurrentModificationException 异常
            
    
    博客分类: Java-Base ConcurrentModificationExceptionjavaArrayListVectoriterator 

 

 

在单线程环境下的解决办法:

在迭代器中如果要删除元素的话,需要调用Itr类的remove方法。

将上述代码改为下面这样就不会报错了:

public class Test {
    public static void main(String[] args)  {
        ArrayList<Integer> list = new ArrayList<Integer>();
        list.add(2);
        Iterator<Integer> iterator = list.iterator();
        while(iterator.hasNext()){
            Integer integer = iterator.next();
            if(integer==2)
                iterator.remove();   //注意这个地方
        }
    }
}

 

在多线程环境下的解决方法

一般有2种解决办法:

  1)在使用iterator迭代的时候使用synchronized或者Lock进行同步;

  2)使用并发容器CopyOnWriteArrayList代替ArrayList和Vector。

 

 

 详细原因及解决方法见:http://www.cnblogs.com/dolphin0520/p/3933551.html