我有以下代碼兩個迭代器拋出ConcurrentModificationException
public static void main(String[] args) {
List<String> list = new ArrayList<>();
Arrays.stream("hello how are you".split(" ")).forEach(s -> list.add(s));
Iterator<String> it = list.iterator();
ListIterator<String> lit = list.listIterator();
while (it.hasNext()) {
String s = it.next();
if (s.startsWith("a")) {
it.remove();
} else {
System.out.println(s);
}
}
System.out.println(list);
// {here}
while (lit.hasNext()) {
String s = lit.next();
if (s.startsWith("a")) {
lit.set("1111" + s);
} else {
System.out.println(s);
}
}
System.out.println(list);
}
這裏,通過Iterator
迭代後,我試圖通過ListIterator
進行迭代。但是代碼會拋出ConcurrentModificationException
。我只在Iterator
完成後才使用ListIterator
進行修改,但爲什麼我會得到這個異常。
當我在位於{here}
處的ListIterator初始化代碼時,代碼完美運行。
- 列表被兩個線程同時修改時,是不是
ConcurrentModificationException
? - 是否初始化迭代器,在列表上創建一個鎖?如果是,那麼Java爲什麼讓我們初始化一個
Iterator
,然後它已經被另一個Iterator
初始化了?
那麼這是否意味着沒有兩個迭代器可以在同一個列表上作用? – v1shnu
你可以讓兩個迭代器同時迭代同一個列表。如果他們不添加或刪除元素,則不會拋出異常。 –
@PaulBoddington爲什麼我們不能同時迭代同一個列表時執行更新操作。迭代器在迭代時是否保留自己的副本,並在所有迭代結束時更新最終列表,或者每遍更新原始列表? –