簡體   English   中英

迭代優先級隊列引發ConcurrentModificationException

[英]iterating priority queue throws ConcurrentModificationException

PriorityQueue<Integer> queue = new PriorityQueue<Integer>(4);
queue.add(8);
queue.add(5);
queue.add(23);
queue.add(6);
for(int i:queue)
   System.out.println(queue.remove());

前面的代碼引發ConcurrentModificationException。 我看不到任何修改優先級隊列的線程。 我確實知道它也是不同步的集合。 我正在使用Oracle Java SDK 6.0運行Ubuntu 12.10。
這個問題看起來很有趣。 有人可以解釋一下嗎? 這是缺陷嗎?

您僅應使用ITERATOR.remove()方法。這是唯一確保您沒有ConcurrentModificationException的方法。

只有一個線程,但是當您對每個線程進行迭代時,實際上是通過從隊列中刪除元素來修改隊列的,因此實際上您最終將在所需的其他步驟修改隊列。

對任何集合進行迭代時,只能使用Iterator.remove()安全地刪除該迭代器的條目(不能刪除其他條目)。這是自Java 1.2引入迭代器以來就已經存在的已知問題。

注意:並發集合保持“弱一致性”,這使您可以在修改集合時對其進行迭代。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM