Java ConcurrentModificationException异常原因和解决方法

Posted 江寒雪

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java ConcurrentModificationException异常原因和解决方法相关的知识,希望对你有一定的参考价值。

在前面一篇文章中提到,对Vector、ArrayList在迭代的时候如果同时对其进行修改就会抛出java.util.ConcurrentModificationException异常。下面我们就来讨论以下这个异常出现的原因以及解决办法。

一.ConcurrentModificationException异常出现的原因

  先看下面这段代码:

1 2 3 4 5 6 7 8 9 10 11 12 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);              

  运行结果:

  从异常信息可以发现,异常出现在checkForComodification()方法中。

  我们不忙看checkForComodification()方法的具体实现,我们先根据程序的代码一步一步看ArrayList源码的实现:

  首先看ArrayList的iterator()方法的具体实现,查看源码发现在ArrayList的源码中并没有iterator()这个方法,那么很显然这个方法应该是其父类或者实现的接口中的方法,我们在其父类AbstractList中找到了iterator()方法的具体实现,下面是其实现代码:

1 2 3 public  Iterator<E> iterator()      return  new  Itr();

  从这段代码可以看出返回的是一个指向Itr类型对象的引用,我们接着看Itr的具体实现,在AbstractList类中找到了Itr类的具体实现,它是AbstractList的一个成员内部类,下面这段代码是Itr类的所有实现:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 private  class  Itr implements  Iterator<E>      int  cursor = 0 ;      int  lastRet = - 1 ;      int  expectedModCount = modCount;      public  boolean  hasNext()             return  cursor != size();           public  E next()             checkForComodification();          try           E next = get(cursor);          lastRet = cursor++;          Java ConcurrentModificationException异常原因和解决方法

Java并发编程:Java ConcurrentModificationException异常原因和解决方法

Java Switch

Java Math

Java 布尔运算

java [Java] Java常用代码#java

(c)2006-2024 SYSTEM All Rights Reserved IT常识