簡體   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