来自 ConcurrentHashMap 的Javadocs:
更新操作之间允许的并发性由可选的 concurrencyLevel 构造函数参数(默认为 16)指导,该参数用作内部大小调整的提示。
我不明白“用作内部尺寸提示”的部分。. 这是什么意思 ?设置此值的最佳实践是什么,它给我们什么保证?
来自 ConcurrentHashMap 的Javadocs:
更新操作之间允许的并发性由可选的 concurrencyLevel 构造函数参数(默认为 16)指导,该参数用作内部大小调整的提示。
我不明白“用作内部尺寸提示”的部分。. 这是什么意思 ?设置此值的最佳实践是什么,它给我们什么保证?
看看 Javadoc 中接下来的句子:
该表在内部进行了分区,以尝试允许指定数量的并发更新而不会发生争用。因为哈希表中的放置本质上是随机的,所以实际的并发性会有所不同。理想情况下,您应该选择一个值来容纳尽可能多的线程同时修改表。使用显着高于您需要的值会浪费空间和时间,而显着降低的值会导致线程争用。但是一个数量级内的高估和低估通常不会产生太大的影响。当已知只有一个线程会修改而所有其他线程只会读取时,值 1 是合适的。此外,调整这种或任何其他类型的哈希表的大小是一个相对较慢的操作,因此,如果可能,
所以换句话说,16 的 concurencyLevel 意味着 ConcurrentHashMap 在内部创建了 16 个单独的哈希表来存储数据。修改一个哈希表中的数据的操作不需要锁定其他哈希表,这允许对整个 Map 进行一定程度的并发访问。
您可能想尝试阅读ConcurrentHashMap 的源代码。
并发级别大约等于可以在不使用内部锁定机制的情况下同时调用 map 上的操作数。正如 maat b 所说, ConcurrentHashMap 将有 N 个内部哈希表,因此在不同哈希表上工作的操作不需要额外的锁定 - 否则,如果操作在同一个内部哈希表上工作,则 ConcurrenyHashMap 对它们使用额外的内部锁定。