2011-08-01 52 views
1

儘管使用迭代器執行刪除操作,但我收到ConcurrentModificationException。任何想法爲什麼?ConcurrentModificationException拋出iterator.remove

for (Iterator<Thread> iter = threads.iterator(); iter.hasNext();) { 
     Thread hook = iter.next(); 
     if(someCondition){ 
       iter.remove(); 
     } 
} 
+3

我的猜測是另一個線程正在搞亂線程列表。有些線程可能會在列表中添加某些內容? – aioobe

+0

你是不是也在同一時間修改? –

回答

1

因爲您有修改併發使用Iterator(不支持)。要麼迭代列表克隆,要麼使用CopyOnWriteArrayList。

或記憶在新列表中刪除什麼,然後調用list.removeAll(whatIWantedToRemove)。

+4

*與使用Iterator併發的修改*只要通過OP描述的迭代器完成修改,就應該可以。 – aioobe

+0

呵呵,我現在覺得很蠢:) – Daniel

+0

列表克隆可能會因爲創建克隆而重複原始列表而遭受同樣的問題。不過,我認爲這可能是最安全的方法。 – Preston

2

從JavaDoc的Iterator.remove()

從底層集合的最後一個元素通過 迭代器(可選操作)返回刪除。每調用一次,該方法只能調用一次 。如果 基礎集合被修改,而迭代進行中的 以任何其他方式調用此方法,則迭代器的行爲是未指定的。

似乎行爲取決於收集。也作爲aioobe指出。當我在其他地方修改集合時,我可以複製ConcurrentModificationException。僅使用Iterator接口,我只能複製IllegalStateException

相關問題