java.util.ConcurrentModificationException 异常

在对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);
         }
     }
}

运行结果:

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

在迭代器中如果要删除元素的话,需要调用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

猜你喜欢

转载自tjy86.iteye.com/blog/2313359