迭代优先级队列抛出ConcurrentModificationException

时间:2012-11-28 09:49:25

标签: java collections

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。
这个问题看起来很有意思。有人可以解释一下吗?这是一个缺陷吗?

2 个答案:

答案 0 :(得分:2)

你应该只使用ITERATOR.remove()方法。它是保证你没有ConcurrentModificationException的唯一方法

只有一个线程。但是当您为每个线程进行迭代时,您实际上是通过从中删除元素来修改队列,这样您实际上最终会在不同的步骤中修改队列。

答案 1 :(得分:2)

当你迭代任何集合时,你只能使用Iterator.remove()来为该迭代器安全地删除条目(而不是其他的)这是自引入Iterator之后自Java 1.2以来一直存在的知识问题。

注意:Concurrent集合保持“弱一致性”,允许您在修改集合时迭代它。