Java 以原子方式深度克隆单独线程中的对象列表
Java Deep Clone List of Objects in Separate Thread Atomically
假设我有一个 ArrayList<Foo>
。此列表修改非常频繁。甚至列表中元素的值也会一直变化。此列表的所有修改都由主线程执行。
我将如何以不延迟主线程(或至少不延迟太多)的方式在单独的线程中克隆列表(深层,元素也应该被克隆),以及复制的列表包含所有 Foo 对象的时间快照(我认为该术语是原子性的),其值与原始列表相同(同样在一个时间快照中)。
提前致谢。我知道解决方案与同步有关,但我无法满足上述所有条件。
不幸的是,没有一个简单的答案。如果对列表所做的修改已经是线程安全的,您可以在列表(或您用于同步的任何内容)上获取一个锁,制作您的副本,然后释放锁。您需要确保对项目本身的任何修改都使用相同的锁。
或者,您可以使用不可变结构(但您不仅需要将其用于列表,还需要将其用于列表内容),这样您就永远不需要锁定,只需获取闲暇时列出。
这两种方法都有缺点和风险。如果你想要好的资源,我强烈推荐Java Concurrency in Practice。
假设我有一个 ArrayList<Foo>
。此列表修改非常频繁。甚至列表中元素的值也会一直变化。此列表的所有修改都由主线程执行。
我将如何以不延迟主线程(或至少不延迟太多)的方式在单独的线程中克隆列表(深层,元素也应该被克隆),以及复制的列表包含所有 Foo 对象的时间快照(我认为该术语是原子性的),其值与原始列表相同(同样在一个时间快照中)。
提前致谢。我知道解决方案与同步有关,但我无法满足上述所有条件。
不幸的是,没有一个简单的答案。如果对列表所做的修改已经是线程安全的,您可以在列表(或您用于同步的任何内容)上获取一个锁,制作您的副本,然后释放锁。您需要确保对项目本身的任何修改都使用相同的锁。
或者,您可以使用不可变结构(但您不仅需要将其用于列表,还需要将其用于列表内容),这样您就永远不需要锁定,只需获取闲暇时列出。
这两种方法都有缺点和风险。如果你想要好的资源,我强烈推荐Java Concurrency in Practice。