LinkedList 跑出的ConcurrentModificationException异常

项目中,使用LinkedList时,后台抛出了ConcurrentModificationException异常

看源码发现问题所在,分析如下:

1.异常最外层的方法(直接抛出异常的方法):

  final void checkForComodification()
    {
      if (LinkedList.this.modCount != this.expectedModCount) {
        throw new ConcurrentModificationException();
      }
    }
  }

modCount:LinkedList对象的字段,add(),remove()操作均会对该字段执行++.

expectedModCount:迭代器iterator对象的字段,同样,add(),remove操作会自增该字段值.

2.抛出异常调用的业务方法模拟:

  <pre name="code" class="java">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);
        }
    }
}

在list对象执行

list.add(2);

后,其modCount
==1,之后生成iterator 对象,iterator的 expectedModCount==1,此时,这二个值是一致的。

当执行<span style="font-family: Verdana, Arial, Helvetica, sans-serif;">list.remove(integer);</span><span style="font-family: Verdana, Arial, Helvetica, sans-serif;">后,注意这个时候,</span><span style="font-family: Verdana, Arial, Helvetica, sans-serif;">modCount ==2,而expectedModCount==1</span><span style="font-family: Verdana, Arial, Helvetica, sans-serif;font-size:18px; line-height: 28px;"></span>

在往下,按正常思维,再次执行

while(iterator.hasNext())时,直觉是我就加了一个对象进来,这个时候,应该没有下一个元素了,所以这里不会进来了..

问题就在这里,因为刚才我们调用的是 list.remove(integer);

执行后,对iterator内部是没有影响的,所以再次执行

while(iterator.hasNext())

后,iterator内部判断还没有达到size,所以还是会继续执行,然后执行

iterator.next();

此时,在next()方法内部会先执行

checkForComodification();

发现modCount 和expectedModCount
不一致,抛出异常。

说到这里大家已经明白了吧

解决方法如下:

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

欢迎交流,转载请注明出处:http://blog.csdn.net/smithdoudou88/article/details/48131107

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-11-09 10:06:34

LinkedList 跑出的ConcurrentModificationException异常的相关文章

ConcurrentModificationException异常解决办法

今天在写一个带缓存功能的访问代理程序时出现了java.util.ConcurrentModificationException异常, 因为该异常是非捕获型异常而且很少见,所以费了些时间才找到问题所在,原来在通过Iterator进行遍历的时候,如果直接对HashMap进行操作后,再继续用之前的Iterator进行遍历就会出现这个异常,表示其HashMap已经被修改. 源程序代码片段如下:caches为一个HashMap对象 1 String sameKeyPart = accesserClassN

(转)Java ConcurrentModificationException异常原因和解决方法

转自 http://www.cnblogs.com/dolphin0520/p/3933551.html 在前面一篇文章中提到,对Vector.ArrayList在迭代的时候如果同时对其进行修改就会抛出java.util.ConcurrentModificationException异常.下面我们就来讨论以下这个异常出现的原因以及解决办法. 以下是本文目录大纲: 一.ConcurrentModificationException异常出现的原因 二.在单线程环境下的解决办法 三.在多线程环境下的解

ConcurrentModificationException异常

介绍一个我今天在开发中遇到的异常:ConcurrentModificationException异常,当然它是一个非受检的异常,也就是运行时异常. 当我们在遍历集合对象的时候,不能够将集合删除.最佳实践是使用集合迭代器 Iterator,删除. 参考资料: ConcurrentModificationException异常 - lirunfa的专栏 - 博客频道 - CSDN.NEThttp://blog.csdn.net/lirunfa/article/details/7353857

java集合--java.util.ConcurrentModificationException异常

ConcurrentModificationException 异常:并发修改异常,当方法检测到对象的并发修改,但不允许这种修改时,抛出此异常.一个线程对collection集合迭代,另一个线程对Collection进行修改的时候, 就会出现上面的异常. 下面看一下代码: package cn.itcast.p4.list.demo; import java.util.ArrayList; import java.util.Iterator; import java.util.List; pub

Java ConcurrentModificationException异常原因和解决方法

在前面一篇文章中提到,对Vector.ArrayList在迭代的时候如果同时对其进行修改就会抛出java.util.ConcurrentModificationException异常.下面我们就来讨论以下这个异常出现的原因以及解决办法. 以下是本文目录大纲: 一.ConcurrentModificationException异常出现的原因 二.在单线程环境下的解决办法 三.在多线程环境下的解决方法 若有不正之处请多多谅解,并欢迎批评指正 请尊重作者劳动成果,转载请标明原文链接: http://w

java.util.ConcurrentModificationException异常分析

Java在操作ArrayList.HashMap.TreeMap等容器类时,遇到了java.util.ConcurrentModificationException异常.以ArrayList为例,如下面的代码片段: [java] view plaincopy import java.util.ArrayList; import java.util.Iterator; import java.util.List; import java.util.concurrent.CopyOnWriteArr

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

Java ConcurrentModificationException异常原因和解决方法 在前面一篇文章中提到,对Vector.ArrayList在迭代的时候如果同时对其进行修改就会抛出java.util.ConcurrentModificationException异常.下面我们就来讨论以下这个异常出现的原因以及解决办法. 以下是本文目录大纲: 一.ConcurrentModificationException异常出现的原因 二.在单线程环境下的解决办法 三.在多线程环境下的解决方法 若有不

List迭代时报ConcurrentModificationException异常

查看源代码我们可以发现,List中有个modCount字段,如果在迭代过程中该字段修改了就会报ConcurrentModificationException异常. 下面看看相关源代码 初始状态下,modCount的值是0,在迭代开始时expectedModCount的值也为0,如果在迭代过程中删除了某个元素,此时modCount++后,modCount的值就变成1,那么下次迭代(调用next方法)时,会先调checkForComodification方法检查modCount和expectedMo

Java ConcurrentModificationException 异常分析与解决方案

Java ConcurrentModificationException 异常分析与解决方案http://www.2cto.com/kf/201403/286536.html java.util.ConcurrentModificationException 解决办法 http://blog.csdn.net/lipei1220/article/details/9028669 原因:Iterator做遍历的时候,HashMap被修改(bb.remove(ele), size-1),Iterato