为什么Java不附带CopyOnWriteMap?

sga*_*gan 39 java collections concurrency map concurrenthashmap

JDK中附带了CopyOnWrite*用于实现SetList,但没有对Map和我常常感叹这个事实.我知道有其他的集合实现有它们,但如果一个标准出货将是很好的.这似乎是一个明显的遗漏,我想知道它是否有充分的理由.任何人都知道为什么这被遗漏了?

Fre*_*mee 28

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

对于包含许多读者且只有一个或几个更新的普通查找表,它非常适合.

与写集合上的副本相比:

读并发:

等于写集合的副本.几个读者可以以无方式同时从地图中检索元素.

写并发:

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

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

  • 在我们的测试中,我们的CopyOnWriteMap(带有底层的juHashMap)优于ConcurrentHashMap进行读取.我们将它用于读取主要(例如配置)性能关键区域.https://labs.atlassian.com/wiki/display/CONCURRENT/CopyOnWriteMap (5认同)
  • 是的,由于某种原因,他们决定将这些信息重定向到内部信息页面而不是bitbucket上的实际目的地:https://bitbucket.org/atlassian/atlassian-util-concurrent/wiki/CopyOnWrite%20Maps (3认同)
  • 如果您需要在一个线程中迭代整个地图,而在另一个线程中发生“ put”事件,那么很高兴知道您的迭代过程不会在中间抛出“ ConcurrentModificationException”。 (3认同)
  • 使用copyOnWrite与ConcurrentHashMap不太一样。例如,在我的情况下,我想对地图的当前视图进行快照,并且我不希望我的读物被某些“文字”所阻塞。我真的不在乎任何新数据,我想在执行第一个“放置”操作时获得一致的地图视图。 (2认同)