2016-11-16 35 views
0

假设我有一个ArrayList<Foo>。这个列表正在被非常频繁地修改。即使列表中元素的值将始终有变化。所有对此列表的修改都由主线程执行。爪哇深克隆分离线程中的对象列表原子

我该如何在单独的线程中克隆列表(深层次,元素应该被克隆),以便它不会延迟主线程(或者至少不会太多),并且复制列表包含所有Foo对象的时间快照(我认为该术语是原子性的),其中有与原始列表相同的值(同样是时间快照)。

在此先感谢。我知道解决方案与同步有关,但我无法满足上述所有标准。

回答

1

不幸的是,这不是一个简单的答案。如果对列表进行的修改已经是线程安全的,那么可以在列表上抓取一个锁(或者用于同步的任何东西),制作副本并释放锁。您需要确保对项目本身的任何修改都使用相同的锁。

或者,你可以使用不可变的结构(但你不仅需要使用这个列表,而且还要使用列表内容),那么你永远不需要锁定,只需要获取列表的一个副本在你的休闲。

这两种方法都有缺点和风险。如果你想要一个好的资源,我强烈建议Java Concurrency in Practice

+0

感谢您的快速响应!尽管我正在寻找一些让我走上正轨的榜样,而不是一本书的链接。 – olta8

+0

CopyOnWriteArrayList似乎工作得很好。 – olta8

+0

的CopyOnWriteArrayList肯定是有用的,但切记要小心有关修改项本身(即在的CopyOnWriteArrayList 的FOOS);它不会为你解决跨线程问题... –