2011-05-01 247 views

回答

30

List.iterator()的行爲未定義或與不同的List實現一致。

對於ArrayList,LinkedList,如果在迭代列表時修改列表,則可能會收到ConcurrentModificationException。 (這是不能保證的)避免這個問題的方法是使用synchronizedList()並在迭代時鎖定列表。

對於Vector,集合是同步的,但迭代器不是線程安全的。

對於CopyOnWriteArrayList,您可以在調用iterator()時獲得列表中元素的快照,此迭代器是線程安全的,並且不需要使用任何鎖定。注意:元素的內容可以改變。

7

沒有迭代器是線程安全的。如果底層集合在迭代中發生更改,則會引發ConcurrentModificationException

即使同步集合的迭代器不是線程安全的 - 您必須手動進行同步。

一個例外是CopyOnWriteArrayList,它在迭代過程中保存了一個快照。

+2

「沒有迭代器是線程安全的,除了一個」可能被寫爲「除了兩個或三個以外,所有都是線程安全的」;) – 2011-05-01 11:07:59

+0

如果底層集合在迭代過程中被另一個線程更改,則CME可能被拋出或可能不被拋出拋出,因爲內部修改計數器不是原子的。 – Anton 2017-01-05 00:10:48