2016-11-16 33 views
0

假設我有一個ArrayList<Foo>。這個列表正在被非常頻繁地修改。即使列表中元素的值將始終有變化。所有對此列表的修改都由主線程執行。爪哇深克隆分離線程中的對象列表原子

我該如何在單獨的線程中克隆列表(深層次,元素應該被克隆),以便它不會延遲主線程(或者至少不會太多),並且複製列表包含所有Foo對象的時間快照(我認爲該術語是原子性的),其中有與原始列表相同的值(同樣是時間快照)。

在此先感謝。我知道解決方案與同步有關,但我無法滿足上述所有標準。

回答

1

不幸的是,這不是一個簡單的答案。如果對列表進行的修改已經是線程安全的,那麼可以在列表上抓取一個鎖(或者用於同步的任何東西),製作副本並釋放鎖。您需要確保對項目本身的任何修改都使用相同的鎖。

或者,你可以使用不可變的結構(但你不僅需要使用這個列表,而且還要使用列表內容),那麼你永遠不需要鎖定,只需要獲取列表的一個副本在你的休閒。

這兩種方法都有缺點和風險。如果你想要一個好的資源,我強烈建議Java Concurrency in Practice

+0

感謝您的快速響應!儘管我正在尋找一些讓我走上正軌的榜樣,而不是一本書的鏈接。 – olta8

+0

CopyOnWriteArrayList似乎工作得很好。 – olta8

+0

的CopyOnWriteArrayList肯定是有用的,但切記要小心有關修改項本身(即在的CopyOnWriteArrayList 的FOOS);它不會爲你解決跨線程問題... –