在iterator.remove上抛出ConcurrentModificationException

时间:2011-08-01 15:58:10

标签: java

尽管使用迭代器执行删除操作,但我收到了ConcurrentModificationException。关于为什么的任何想法?

for (Iterator<Thread> iter = threads.iterator(); iter.hasNext();) {
        Thread hook = iter.next();
        if(someCondition){
                iter.remove();
        }
}

2 个答案:

答案 0 :(得分:2)

来自JavaDoc Iterator.remove()

  

从底层集合中删除返回的最后一个元素   迭代器(可选操作)。此方法只能调用一次   每次打电话给下一个。如果是,则未指定迭代器的行为   迭代正在进行时修改底层集合   除了通过调用此方法之外的任何其他方式。

似乎行为依赖于集合。同样正如aioobe所指出的那样。当我在其他地方修改集合时,我可以重现ConcurrentModificationException。仅使用Iterator界面,我只能重现IllegalStateException

答案 1 :(得分:1)

因为您对使用Iterator进行了并发修改,因此不支持。迭代列表克隆,或使用CopyOnWriteArrayList。

或记忆新列表中要删除的内容,然后调用list.removeAll(whatIWantedToRemove)。