繁体   English   中英

为什么此代码引发ConcurrentModificationException?

[英]Why is this code throwing a ConcurrentModificationException?

下面是代码,即使我没有修改基础集合及其作为单线程运行,我也在subiter.next()调用中得到了ConcurrentModificationException

Tree tree=partition.getTreeofThisPartition();
Set<DzExpressionHostTupel> oldSubtupels=tree.getSubscribers();
Iterator<DzExpressionHostTupel> subiter=oldSubtupels.iterator();           
while (subiter.hasNext()){
    DzExpressionHostTupel subtupel=subiter.next();
    tree.removeSubscriber(subtupel);
}

如果您阅读https://docs.oracle.com/javase/7/docs/api/java/util/ConcurrentModificationException.html ,则会显示:

例如,通常不允许一个线程修改Collection而另一个线程对其进行迭代。 通常,在这些情况下,迭代的结果是不确定的。 如果检测到此行为,则某些Iterator实现(包括JRE提供的所有通用集合实现的实现)可能会选择抛出此异常。 执行此操作的迭代器称为快速失败迭代器,因为它们会快速干净地失败,而不是在未来的不确定时间内冒任意,不确定的行为的风险。

请注意,此异常并不总是表示对象已被其他线程同时修改。 如果单个线程发出违反对象约定的方法调用序列,则该对象可能会抛出此异常。 例如,如果线程在使用快速失败迭代器迭代集合时直接修改了集合,则迭代器将抛出此异常。

(强调)。

我在猜tree.removeSubscriber(subtupel); 正在修改其subscribers集。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM