JDK内置了CopyOnWrite*
实现,用于实现Set
和List
,但没有为Map
提供,我经常对此感到遗憾。我知道还有其他的集合实现具有这些功能,但如果标准库中也提供这一功能就太好了。这似乎是一个明显的缺失,我想知道是否有充分的理由。有人知道为什么会被忽略吗?
JDK内置了CopyOnWrite*
实现,用于实现Set
和List
,但没有为Map
提供,我经常对此感到遗憾。我知道还有其他的集合实现具有这些功能,但如果标准库中也提供这一功能就太好了。这似乎是一个明显的缺失,我想知道是否有充分的理由。有人知道为什么会被忽略吗?
我猜这取决于你的用例,但是既然你已经有了ConcurrentHashMap,为什么还需要CopyOnWriteMap呢?
对于只有一个或少数更新操作,但有很多读取操作的简单查找表而言,它非常适合。
相对于写入时复制集合:
读取并发性:
等同于写入时复制集合。几个读者可以以无锁方式同时从地图中检索元素。
写入并发性:
比写入时复制集合更好的并发性,后者基本上会将更新序列化(一次一个更新)。如果你的哈希键均匀分布,使用并发哈希映射你就有很好的机会同时进行多个更新。
如果你想要实现CopyOnWriteMap的效果,可以始终使用并发级别为1的ConcurrentHashMap进行初始化。
实现一个集合最简单的方法通常是使用底层的映射。它们甚至有一个 Collections.newSetFromMap() 方法[可能只在1.6版本以上可用]。
他们应该做的是有一个CopyOnWriteMap和CopyOnWriteSet,它们相当于Collections.newSetFromMap(new CopyOnWriteMap())。
但是正如你所看到的CopyOnWriteArraySet实际上是由数组而不是映射支持的。对于您的用例,Collections.newSetFromMap(ConcurrentHashMap())是否可接受?