0
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 を実行しています。
この問題は非常に興味深いようです。誰か説明してもらえますか?それは欠陥ですか?

4

2 に答える 2

2

ITERATOR.remove()メソッドのみを使用する必要があります。これは、ConcurrentModificationExceptionが発生しないことを保証する唯一のメソッドです。

スレッドは1つだけですが、それぞれに対して反復する場合、実際にはキューから要素を削除してキューを変更するため、最終的には必要な別のステップでキューを変更します。

于 2012-11-28T09:51:30.453 に答える
2

任意のコレクションを繰り返し処理する場合、Iterator.remove() を使用して、そのイテレーターのエントリを安全に削除することしかできません (他のものは削除できません)。

注: 並行コレクションは、変更中にコレクションを反復処理できるようにする「弱い整合性」を維持します。

于 2012-11-28T09:54:49.083 に答える