High Find Mortgage Home Mortgages Mortgages Www.aaaqe.com

Findmortgagehomemortgages C Find Mortgage Home Mortgages Es Article Love Find Mortgage Home Mortgages java.util.ConcurrentModificationException - 我的JAVA学习笔记 - BlogJava

Findmortgagehomemortgages C Find Mortgage Home Mortgages Es Article Love Find Mortgage Home Mortgages

Mortgage Article Findmortgagehomemortgages search Mortgage Mortgages searcho Love tasearche Mortgage www.ddaa66.com osearche Article 6searchL Mortgages v Find searchs Love asearchcsearchm
  • 2009年2月 (1)
  • 2008年8月 (5)
  • 2008年6月 (2)
  • 2008年5月 (1)
  • 2008年4月 (1)
  • 2008年3月 (1)
  • 2008年2月 (2)
  • 2008年1月 (7)
  • 2007年12月 (1)
  • 2007年11月 (4)
  • 最新评论

    阅读排行榜

    评论排行榜

    java.util.ConcurrentModificationException
    工作中碰到个ConcurrentModificationException。代码如下:
    List list = ...;
    for(Iterator iter = list.iterator(); iter.hasNext();) {}
    }
    在执行了remove方法之后,再去执行循环,iter.next()的时候,报java.util.ConcurrentModificationException(当然,如果remove的是最后一条,就不会再去执行next()操作了)

    下面来看一下源码
    public interface Iterator<E> {}

    public interface Collection<E> extends Iterable<E> {}

    这里有两个remove方法

    接下来来看看AbstractList
    public abstract class AbstractList<E> extends AbstractCollection<E> implements List<E> {}

            public E next() {} catch(IndexOutOfBoundsException e) {}
            }

            public void remove() {} catch(IndexOutOfBoundsException e) {}
            }

            final void checkForComodification() {}
        }   
    }


    remove(Object o)在ArrayList中实现如下:
    public boolean remove(Object o) {}
        } else {}
        }
        return false;
    }
    private void fastRemove(int index) {}

    所以,产生ConcurrentModificationException的原因就是:
    执行remove(Object o)方法之后,modCount和expectedModCount不相等了。然后当代码执行到next()方法时,判断了checkForComodification(),发现两个数值不等,就抛出了该Exception。
    要避免这个Exception,就应该使用remove()方法。

    这里我们就不看add(Object o)方法了,也是同样的原因,但没有对应的add()方法。一般嘛,就另建一个List了


    下面是网上的其他解释,更能从本质上解释原因:
    Iterator 是工作在一个独立的线程中,并且拥有一个 mutex 锁。 Iterator 被创建之后会建立一个指向原来对象的单链索引表,当原来的对象数量发生变化时,这个索引表的内容不会同步改变,所以当索引指针往后移动的时候就找不到要迭代的对象,所以按照 fail-fast 原则 Iterator 会马上抛出 java.util.ConcurrentModificationException 异常。
    所以 Iterator 在工作的时候是不允许被迭代的对象被改变的。但你可以使用 Iterator 本身的方法 remove() 来删除对象, Iterator.remove() 方法会在删除当前迭代对象的同时维护索引的一致性。

    yuanchuang/week-14/iterator.html

    posted on 2008-08-31 19:44 EvanLiu 阅读(35885) 评论(2)  编辑  收藏 所属分类: Java基础

    FeedBack:
    # re: java.util.ConcurrentModificationException 2011-11-30 03:28 子墨
    用remove(index)方法就不会有这种情况  回复  更多评论
      
    # re: java.util.ConcurrentModificationException[未登录] 2012-03-06 13:58 飞天奔月
    @子墨 +1
      回复  更多评论
      
    新用户注册  刷新评论列表  

    博问 - 解决您的IT难题
    博问  闪存  学英语  -->Java程序员招聘
    标题
    姓名
    主页
    验证码 *  
    内容(请不要发表任何与政治相关的内容)
      登录