java iterator即使采取预防措施也可以进行并发修改

时间:2015-06-26 17:27:01

标签: java concurrency iterator

我需要从列表中递归删除元素,但即使将迭代器应用于主题的副本,我也会遇到并发修改错误。

List<Referee> referees=videogame.getGamers();
Iterator<Referee> iter= referees.iterator();

while(iter.hasNext()){
    Referee ref= iter.next();
    if(ref.getTheGameIsOver())
    videogame.removeReferee(ref);
}

2 个答案:

答案 0 :(得分:2)

Iterator迭代它时,您正在修改基础集合。这就是造成ConcurrentModificationException

的原因

而是在Iterator本身上调用remove()。它会导致此异常,从而删除最近迭代的项目。取代

videogame.removeReferee(ref);

iter.remove();

答案 1 :(得分:1)

使用它的正确方法如下所示,因为迭代器对象在列表导航时知道它在列表中的位置。

List<Referee> referees=videogame.getGamers();
Iterator<Referee> iter= referees.iterator();

while(iter.hasNext()){
    Referee ref= iter.next();
    if(ref.getTheGameIsOver())
    iter.remove()
}

请参阅http://durgaprasadtechie.blogspot.com/2011/07/concurrentmodificationexception-fail.html