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 的唯一方法

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

于 2012-11-28T09:51:30.453 回答
2

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

注意:并发集合保持“弱一致性”,允许您在修改集合时对其进行迭代。

于 2012-11-28T09:54:49.083 回答