Java深度克隆对象列表在单独的线程原子



假设我有一个ArrayList<Foo>。这个列表正在被频繁地修改。甚至列表中元素的值也会一直变化。对这个列表的所有修改都是由主线程执行的。

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

提前感谢。我知道解决方案必须与同步有关,但我不知道是否满足上述所有标准。

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

或者,您可以使用不可变结构(但您不仅需要将其用于列表,还需要将其用于列表内容),这样您就永远不需要锁定,并且可以在空闲时获取列表的副本。

这两种方法都有缺点和风险。如果您需要一个好的资源,我强烈推荐Java Concurrency in Practice。

最新更新