sort - java set




在什麼情況下CopyOnWriteArrayList適合? (2)

這個問題在這裡已有答案:

我正在學習CopyOnWriteArrayList類。

  • 複製新陣列的目的是什麼?
  • 是否其他線程讀取數組?

因此,如果系統具有高並發性並且大多數線程的操作都在讀取而不是寫入,則最好使用CopyOnWriteArrayList


應對新陣列的目的是什麼?

複製底層數組可確保數據結構的任何迭代都是安全的,因為迭代是在數據的基本上不可變的“快照”上進行的。

是否其他線程讀取數組?

有點。 更具體地說,每個線程都能夠安全地迭代數組,而不必擔心ConcurrentModificationException或其他未知/未定義的行為。

因此,如果系統是高並發性並且大多數線程的操作都是在讀取而不是寫入,那麼最好使用CopyOnWriteArrayList。 我對嗎?

不可以。只有當大多數線程的動作都是列表上的迭代時。 如果大多數活動是基於隨機訪問的讀取,則ReadWriteLock可能更好。

來自CopyOnWriteArrayList的javadoc

這通常成本太高,但是當遍歷操作大大超過突變時,它可能比替代方法更有效,並且在您不能或不想同步遍歷但需要排除並發線程之間的干擾時非常有用。


如此link

CopyOnWriteArrayList是Java 5 Concurrency API中引入的並發Collection類,以及Java中流行的堂兄ConcurrentHashMap。

CopyOnWriteArrayList實現List接口,如ArrayList,Vector和LinkedList,但它是一個線程安全的集合,它以與Vector或其他線程安全的集合類略有不同的方式實現其線程安全性。

顧名思義,CopyOnWriteArrayList使用每個變異操作(例如add或set)創建基礎ArrayList的副本。 通常,CopyOnWriteArrayList非常昂貴,因為它涉及每次寫入操作都需要昂貴的Array副本,但是如果你有一個List,其中迭代次數超過了變量,那麼它非常有效。例如,你需要迭代ArrayList並且不要經常修改它。

CopyOnWriteArrayList的迭代器是故障安全的,並且即使在Iteration開始後修改了底層的CopyOnWriteArrayList 也不會拋出ConcurrentModificationException,因為Iterator在ArrayList的單獨副本上運行。 因此,Iterator無法使用CopyOnWriteArrayList上的所有更新。

要獲得最新版本,請執行list.iterator();

話雖這麼說,更新這個集合很多將殺死性能。 如果您嘗試對CopyOnWriteArrayList進行排序,您將看到該列表拋出UsupportedOperationException(排序調用集合上的N次)。 當您進行90%以上的讀取時,您應該只使用此讀取。





collections