繁体   English   中英

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

[英]Concurrent Modification Exception thrown by .next from Iterator

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

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

    }

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

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

有任何想法吗?

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

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

  1. 另一个线程是直接或通过其迭代器更新stockList
  2. 在同一个线程中,也许在这个循环本身内部,修改了stockList(参见下面的示例)

以下代码可能导致ConcurrentModificationException

Iterator<Stock> itr = stockList.iterator();
 while(itr.hasNext()) 
    { 
        Stock temp = itr.next(); 

        stockList.add(new Stock()); // Causes ConcurrentModificationException 

        stockList.remove(0) //Causes ConcurrentModificationException 
    } 

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

最合理的原因是一些代码在您获得迭代器后修改了底层集合。

表单javadoc

此类的iterator和listIterator方法返回的迭代器是快速失败的:如果在创建迭代器之后的任何时候对列表进行结构修改,除了通过迭代器自己的remove或add方法之外,迭代器将抛出ConcurrentModificationException。 因此,在并发修改的情况下,迭代器快速而干净地失败,而不是在未来的未确定时间冒着任意的,非确定性行为的风险。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM