[英]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.