来自ConcurrentHashMap的Javadocs:
更新操作之间允许的并发性由 可选的concurrencyLevel构造函数参数(默认为16),即 用作内部尺寸的暗示。
我不明白“哪个用作暗示内部尺寸”的部分。 。这是什么意思 ?设置此值的最佳做法是什么?它给我们提供了什么保证?
答案 0 :(得分:3)
看看Javadoc中的下一句话:
该表在内部分区以尝试允许指示 没有争用的并发更新数。因为安置 在散列表中基本上是随机的,实际的并发性 变化。理想情况下,您应该选择一个值来容纳尽可能多的值 线程将同时修改表。用一个 比你需要的价值高得多可以浪费空间和时间, 并且显着较低的值可能导致线程争用。但 过高估计和低估了一个数量级 通常不会产生明显的影响。值为1 适当的时候知道只有一个线程会修改和 所有其他人只会阅读。此外,调整此或任何其他类型 哈希表是一个相对较慢的操作,因此,如果可能,它是 一个好主意,提供预期表格大小的估计 构造
换句话说,concurencyLevel为16意味着ConcurrentHashMap在内部创建了16个单独的哈希表来存储数据。修改一个哈希表中的数据的操作不需要锁定其他哈希表,这允许对整个Map进行某种程度的并发访问。
您可能想尝试阅读the source of ConcurrentHashMap。
答案 1 :(得分:0)
并发级别大约相等,可以在不使用内部锁定机制的情况下同时调用map上的多少个操作。正如maat b所说,ConcurrentHashMap将有N个内部哈希表,因此处理不同哈希表的操作不需要额外的锁定 - 否则如果操作在相同的内部哈希表上工作,那么ConcurrenyHashMap会对它们使用额外的内部锁定。