[英]Why does this code throw 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.