簡體   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