为什么Java不附带CopyOnWriteMap?

时间:2010-11-22 01:15:33

标签: java collections map concurrency concurrenthashmap

JDK附带CopyOnWrite*Set的{​​{1}}个实现,但List没有,我经常感叹这个事实。我知道有其他的集合实现有它们,但如果一个标准出货将是很好的。这似乎是一个明显的遗漏,我想知道它是否有充分的理由。任何人都知道为什么这被遗漏了?

2 个答案:

答案 0 :(得分:27)

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

对于包含许多读者且只有一个或几个更新的普通查找表,这是一个不错的选择。

与写集合上的副本相比:

阅读并发:

等同于写入集合的副本。一些读者可以以无锁方式同时从地图中检索元素。

写并发:

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

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

答案 1 :(得分:0)

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

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

但正如您所见, CopyOnWriteArraySet 实际上是由数组而不是地图支持的。并且 Collections.newSetFromMap(ConcurrentHashMap())是否可以接受您的用例?