Java 关于LinkedBlockingQueue迭代器从不抛出ConcurrentModificationException

Java 关于LinkedBlockingQueue迭代器从不抛出ConcurrentModificationException,java,concurrency,Java,Concurrency,包java.util.concurrent.ThreadPoolExecutor具有以下方法: public void purge() { final BlockingQueue<Runnable> q = workQueue; try { Iterator<Runnable> it = q.iterator(); while (it.hasNext()) { Runnable r = it.next

java.util.concurrent.ThreadPoolExecutor
具有以下方法:

public void purge() {
    final BlockingQueue<Runnable> q = workQueue;
    try {
        Iterator<Runnable> it = q.iterator();
        while (it.hasNext()) {
            Runnable r = it.next();
            if (r instanceof Future<?> && ((Future<?>)r).isCancelled())
                it.remove();
        }
    } catch (ConcurrentModificationException fallThrough) {
        // Take slow path if we encounter interference during traversal.
        // Make copy for traversal and call remove for cancelled entries.
        // The slow path is more likely to be O(N*N).
        for (Object r : q.toArray())
            if (r instanceof Future<?> && ((Future<?>)r).isCancelled())
                q.remove(r);
    }

    tryTerminate(); // In case SHUTDOWN and now empty
}
public void purge(){
最终阻塞队列q=工作队列;
试一试{
迭代器it=q.Iterator();
while(it.hasNext()){
Runnable r=it.next();
if(Future&((Future)r.isCancelled()的r实例)
it.remove();
}
}捕获(ConcurrentModificationException故障诊断){
//如果在穿越过程中遇到干扰,请选择慢速路径。
//为遍历创建副本,并为取消的条目调用remove。
//慢路径更可能是O(N*N)。
对于(对象r:q.toArray())
if(Future&((Future)r.isCancelled()的r实例)
q、 移除(r);
}
tryTerminate();//如果关机,现在为空
}
有一个异常
ConcurrentModificationException
,但在Java文档中我可以看到:

返回的迭代器是一个“弱一致”迭代器,它永远不会抛出ConcurrentModificationException,并保证在构造迭代器时遍历元素,并且可能(但不保证)反映构造之后的任何修改


请告诉我如何理解。

正如您在
ThreadPoolExecutor
构造函数中看到的,您可以为其提供任何
阻塞队列

public ThreadPoolExecutor(int corePoolSize,
                          int maximumPoolSize,
                          long keepAliveTime,
                          TimeUnit unit,
                          BlockingQueue<Runnable> workQueue)
public ThreadPoolExecutor(int-corePoolSize,
int maximumPoolSize,
长时间,
时间单位,
阻塞队列(工作队列)

它可以是您自己的实现,不必是弱一致的,尽管它不必抛出
ConcurrentModificationException
或者这是通常抛出的异常,因此这是Java开发人员的一些防御性编程。

您引用的Java文档来自哪个类或方法?参考LinkedBlockingQueue您可以搜索关于方法迭代器的信息;另外,请参阅并验证该类中未使用LinkedBlockingQueue。