Java 迭代优先级队列引发ConcurrentModificationException PriorityQueue=newpriorityqueue(4); 添加(8); 添加(5); 添加(23); 添加(6); for(int i:队列) System.out.println(queue.remove());

Java 迭代优先级队列引发ConcurrentModificationException PriorityQueue=newpriorityqueue(4); 添加(8); 添加(5); 添加(23); 添加(6); for(int i:队列) System.out.println(queue.remove());,java,collections,Java,Collections,前面的代码抛出ConcurrentModificationException。我没有看到任何修改优先级队列的线程。我知道这也是非同步收集。 我使用Oracle Java SDK 6.0运行Ubuntu 12.10 这个问题看起来很有趣。有人能解释一下吗?这是一个缺陷吗?您应该只使用ITERATOR.remove()方法。它是唯一保证您没有ConcurrentModificationException的方法 只有一个线程。但是当您对每个线程进行迭代时,实际上是通过从队列中删除元素来修改队列,以便最

前面的代码抛出ConcurrentModificationException。我没有看到任何修改优先级队列的线程。我知道这也是非同步收集。 我使用Oracle Java SDK 6.0运行Ubuntu 12.10

这个问题看起来很有趣。有人能解释一下吗?这是一个缺陷吗?

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


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

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


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

当您对任何集合进行迭代时,您只能使用Iterator.remove()安全地删除该迭代器(而不是其他)的条目这是一个从Java1.2引入迭代器以来就存在的诀窍


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

当您对任何集合进行迭代时,您只能使用Iterator.remove()安全地删除该迭代器的项(而不是其他项)这是一个从Java1.2引入迭代器以来就存在的诀窍

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

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());