为什么Java没有附带CopyOnWriteMap?

JDK 附带了 和 的实现,但没有一个实现,我经常哀叹这个事实。我知道还有其他集合实现有它们,但如果有一个作为标准发布会很好。这似乎是一个明显的遗漏,我想知道是否有充分的理由。有人知道为什么这被遗漏了吗?CopyOnWrite*SetListMap


答案 1

我想这取决于你的用例,但是当你已经有了一个 ConcurrentHashMap 时,为什么还需要一个 CopyOnWriteMap 呢?

对于具有许多读者且只有一个或几个更新的普通查找表,它是一个很好的选择。

与写入集合上的副本相比:

读取并发:

等于写入集合时的副本。多个读取器可以以无锁方式同时从映射中检索元素。

写入并发:

与基本上序列化更新(一次一个更新)的写入集合上的副本相比,并发性更好。使用并发哈希映射,您很有可能同时进行多次更新。如果您的哈希键均匀分布。

如果确实希望在写入映射上具有副本的效果,则始终可以初始化并发级别为 1 的 ConcurrentHashMap。


答案 2

集合的最简单实现通常是使用基础映射。他们甚至有一个 Collections.newSetFromMap() 方法(可能仅来自 1.6)。<

他们应该做的是有一个CopyOnWriteMap,CopyOnWriteSet相当于Collections.newSetFromMap(new CopyOnWriteMap())。

但正如你所看到的,CopyOnWriteArraySet实际上是由一个数组而不是一个映射支持的。Collections.newSetFromMap(ConcurrentHashMap()) 对于您的用例来说难道不能被接受吗?