2

是否可以为 Java 中的多线程应用程序添加软件强制写入时复制?我的意思是线程具有对同一对象的引用,但是当一个线程尝试修改它时,所指向的对象被复制并且引用被调整为指向该副本。

4

3 回答 3

2

我知道的唯一实现是

java.util.concurrent.CopyOnWriteArrayList

http://docs.oracle.com/javase/6/docs/api/java/util/concurrent/CopyOnWriteArrayList.html

和相关的 Set 类

java.util.concurrent.CopyOnWriteArraySet

最后

org.apache.mina.util.CopyOnWriteMap

但这取决于您的需要。

于 2014-01-30T19:17:56.153 回答
2

如果你的问题是,

是否可以在整个 Java 运行时全面强制执行写入时复制行为

那么答案是,

不,Java 中没有这样的通用能力。

实际上,我认为最接近该目标的可能是使用 Clojure。它所有的默认数据结构在内部都是写时复制的,而在外部它们只是不可变的对象。

令人惊讶的是,您谈论的引用被称为refs 并且它们支持完整的内存事务。一种更简单的参考是atom,它 100% 符合您的描述。

整个 Core API 致力于以线程安全、无锁的方式对这些结构进行优雅而令人印象深刻的操作。

于 2014-01-30T19:20:49.030 回答
1

是的。延迟复制很容易实现,但通常您必须自己完成。

于 2014-01-30T19:11:26.693 回答