来自Iterator的.next引发的并发修改异常

时间:2010-02-12 03:08:05

标签: java exception concurrency

不确定这里究竟出了什么问题:

    while(itr.hasNext())
    {
        Stock temp =itr.next();

    }

此代码在itr.next()中抛出ConcurrentModificationException;

迭代器的初始化是 private Iterator<Stock> itr=stockList.iterator();

有什么想法吗?

[基本代码直接从教授的幻灯片中复制]

3 个答案:

答案 0 :(得分:5)

这可能是因为两个原因而发生的。

  1. 另一个主题是直接或通过其迭代器
  2. 更新stockList
  3. 在同一个帖子中,也许在这个循环本身内部,修改了stockList(参见下面的例子)
  4. 以下代码可能导致ConcurrentModificationException

    Iterator<Stock> itr = stockList.iterator();
     while(itr.hasNext()) 
        { 
            Stock temp = itr.next(); 
    
            stockList.add(new Stock()); // Causes ConcurrentModificationException 
    
            stockList.remove(0) //Causes ConcurrentModificationException 
        } 
    

答案 1 :(得分:1)

其他一些线程正在修改底层集合?我怀疑有一些代码高于你向我们展示的导致问题的代码:调用iterator()和循环之间的集合的mod。

答案 2 :(得分:0)

最合理的原因是某些代码在您获得迭代器后修改了基础集合。

表格javadoc

  

此类返回的迭代器   iterator和listIterator方法是   失败快速:如果列表是结构性的   之后随时修改   除了以外的任何方式创建迭代器   通过迭代器自己删除或   添加方法,迭代器将抛出一个   ConcurrentModificationException的。从而,   面对并发   修改,迭代器失败   快速而干净,而不是   冒着任意,不确定的风险   在一个不确定的时间的行为   未来。