【问题标题】:java iterator concurrent modification even with precautionsjava迭代器并发修改即使有预防措施
【发布时间】:2015-06-26 17:27:01
【问题描述】:

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

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

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

【问题讨论】:

  • removeReferee 是做什么的?它是否从getGamers 返回并由iter 迭代的同一个List 中删除?
  • 或者在使用 Java 8 时:videogame.getGamers().removeIf(Referee::getTheGameIsOver);...

标签: java concurrency iterator


【解决方案1】:

Iterator 正在对其进行迭代时,您正在修改基础集合。这就是导致ConcurrentModificationException 的原因。

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

videogame.removeReferee(ref);

iter.remove();

【讨论】:

    【解决方案2】:

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

    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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-05-01
      • 2019-01-04
      • 1970-01-01
      • 2015-01-12
      • 2011-01-16
      • 1970-01-01
      • 2014-09-20
      • 1970-01-01
      相关资源
      最近更新 更多