`

java.util.ConcurrentModificationException

    博客分类:
  • Java
阅读更多
for(CitationDo citation : citations) {
    int year = citation.getYear();
    if(year != 0) {
       if(paperYear > year) {
	  citations.remove(citation);			     
           num --;
       }
    }
}

上述代码执行过程中会抛出java.util.ConcurrentModificationException

根据网上大牛对java源码的分析:

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

for (Iterator it = citations.iterator(); it.hasNext();){    
	CitationDo citation = (CitationDo)it.next();
	int year = citation.getYear();
	if(year != 0) {
	     if(paperYear > year) {
	         it.remove();
	         num --;
	     }
         }
}  


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


参考:http://www.blogjava.net/EvanLiu/archive/2008/08/31/224453.html
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics