44

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

4

2 回答 2

33

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

对于具有许多读者且只有一个或几个更新的简单查找表来说,它非常适合。

与写集合时的副本相比:

读取并发:

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

写并发:

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

如果您确实希望在 write map 上具有副本的效果,您始终可以初始化并发级别为 1 的 ConcurrentHashMap。

于 2010-11-28T20:19:36.163 回答
-3

集合的最简单实现通常是使用底层映射。他们甚至有一个Collections.newSetFromMap()方法[可能仅从 1.6 开始]。

他们应该做的是拥有一个 CopyOnWriteMap 和 CopyOnWriteSet 等效于 Collections.newSetFromMap(new CopyOnWriteMap())。

但正如您所见,CopyOnWriteArraySet实际上是由数组而不是映射支持的。Collections.newSetFromMap(ConcurrentHashMap())不适合您的用例吗?

于 2012-02-07T21:19:32.050 回答