java.util.ConcurrentModificationException 异常

阅读更多

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

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

 

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

 

运行结果:

java.util.ConcurrentModificationException 异常_第1张图片

 

 

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

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

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

public  class  Test {
     public  static  void  main(String[] args)  {
         ArrayList list =  new  ArrayList();
         list.add( 2 );
         Iterator 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

 

你可能感兴趣的:(java,ArrayList,Vector,iterator)