JDK附带CopyOnWrite*
和Set
的{{1}}个实现,但List
没有,我经常感叹这个事实。我知道有其他的集合实现有它们,但如果一个标准出货将是很好的。这似乎是一个明显的遗漏,我想知道它是否有充分的理由。任何人都知道为什么这被遗漏了?
答案 0 :(得分:27)
我想这取决于你的用例,但是当你已经拥有ConcurrentHashMap时,为什么还需要一个CopyOnWriteMap?
对于包含许多读者且只有一个或几个更新的普通查找表,这是一个不错的选择。
与写集合上的副本相比:
阅读并发:
等同于写入集合的副本。一些读者可以以无锁方式同时从地图中检索元素。
写并发:
比基本序列化更新的写入集合上的副本更好的并发性(一次更新一次)。使用并发哈希映射,您很有可能同时执行多个更新。如果您的哈希键均匀分布。
如果执行希望在写入映射上具有副本效果,则始终可以初始化并发级别为1的ConcurrentHashMap。
答案 1 :(得分:0)
集合的最简单实现通常是使用底层映射。他们甚至有一个 Collections.newSetFromMap()方法[可能仅来自1.6]。
他们应该做的是拥有一个CopyOnWriteMap,而CopyOnWriteSet等同于Collections.newSetFromMap(new CopyOnWriteMap())。
但正如您所见, CopyOnWriteArraySet 实际上是由数组而不是地图支持的。并且 Collections.newSetFromMap(ConcurrentHashMap())是否可以接受您的用例?