当写操作超过读操作时,获取并发哈希集的最佳方法是什么?
我发现我们可以使用newKeySet();
或从ConcurrentHashMap
获得keySet(default value)
的并发哈希集。当写操作超过读操作时,这是创建线程安全集的最佳方法
我读过CopyOnWriteArraySet
读得过多似乎比写得好
欢迎所有可能有助于我们进一步了解这一点的答案
你可以在下面搜索框中键入要查询的问题!
我发现我们可以使用newKeySet();
或从ConcurrentHashMap
获得keySet(default value)
的并发哈希集。当写操作超过读操作时,这是创建线程安全集的最佳方法
我读过CopyOnWriteArraySet
读得过多似乎比写得好
欢迎所有可能有助于我们进一步了解这一点的答案
# 1 楼答案
返回
KeySetView
的ConcurrentHashMap.newKeySet()
和ConcurrentHashMap.keySet()
依赖于ConcurrentHashMap
类,该类仅在写入时锁定,并且仅锁定与写入相关的键映射,而不是整个映射因此,读操作很快,但写操作也很快(事实上,读操作稍微慢一点)
依赖于
CopyOnWriteArraySet
的CopyOnWriteArrayList
不锁定读取操作,而是锁定写入操作。因此,为了保证并发读取一致性,每个写入操作都会触发底层数组的副本因此,对于不小的集合(
100
元素或更多,例如,CopyOnWriteArraySet
写入操作应该比KeySetView
(仅锁定且唯一地锁定相关条目)更昂贵(锁定整个集合+基础数组的副本)该^{} javadoc 强调了这一点:
这里有一个基准,我们在这里比较这两种行为
在每次迭代中,
Set<String>
用100个元素(“0”到99”值)初始化。前6种方法是写入操作(删除、添加新元素、覆盖现有元素)
接下来的4个方法是读取操作(迭代、包含)
有结果(分数越低越好)
写入操作:
读取操作:
只有迭代器的两个
Set
实现的读取速度一样快在任何情况下
CopyOnWriteArraySet
的写入速度都要慢得多,但是当我们add()
没有一个存在的值时,情况就更糟了# 2 楼答案
如果键是小整数,可以使用位掩码。然而,如果没有更多的信息,我会建议