2010-11-19 46 views
14

CopyOnWriteArrayList的javadocs說CopyOnWriteArrayList的行爲

ArrayList的線程安全變體,其中所有的變異操作 (add,set等)都是通過製作 底層數組的新副本來實現的。

我現在很困惑其他線程何時會看到這個新副本中存在的變化?這是否意味着底層數組的副本數量等於集合的突變數量?如果不是這樣,何時將這些單個副本的更改傳輸到基礎數組,以便其他線程可以看到它們?

回答

17

這裏的想法是,無論何時添加或刪除CopyOnWriteArrayList,基本數組基本上都與修改複製。

這是否意味着會有同等 到 收集的突變數量底層數組的 拷貝數

是,對於每一個線程更新ArrayList所有其他線程持有一個較舊的副本本質上會引用一個不同的數組。

當這些 個別拷貝的變化被轉移到 底層數組,使得其他線程 可以看到它們?

您正在查看的數組(目前可以說您的迭代器)永遠不會改變。當你從一個數組中讀取數據時,你正在閱讀它,就像你開始閱讀時一樣。如果CopyOnWriteArrayList由另一個線程更改,則當前觀察的數組不會生效。

要獲得最新版本做了新的念想list.iterator();

話雖這麼說,更新這個集合了很多會殺了性能。如果您嘗試對CopyOnWriteArrayList進行排序,則會看到該列表將拋出UsupportedOperationException(排序在集合上調用集N次)。只有在讀數超過90%時,才應使用此讀數。