假设我有ArrayList<Foo>
。此列表正在经常修改。即使列表中元素的值也会有值一直在变化的值。对此列表的所有修改都由主线程执行。
我如何在一个单独的线程中克隆列表(深层,元素也应克隆),这样它不会延迟主线程(或至少不会延迟),以及复制的列表包含所有Foo对象的及时快照(我认为该术语是原子的),其值与原始列表相同(同样在一个时间快照中)。
提前致谢。我知道解决方案与同步有关,但我无法满足上述所有标准。
答案 0 :(得分:0)
不幸的是,这并不是一个简单的答案。如果对列表进行的修改已经是线程安全的,您可以获取列表上的锁(或者您用于同步的任何内容),制作副本并释放锁。您需要确保对项目本身的任何修改都使用相同的锁定。
或者,您可以使用不可变构造(但是您不仅要将其用于列表,还要用于列表内容),那么您永远不需要锁定并且只需抓取一份副本即可。列出你的闲暇时光。
这两种方法都存在缺点和风险。如果您想要一个好的资源,我强烈推荐Java Concurrency in Practice。