ConcurrentHashMap的concurrencyLevel参数给出了什么保证?

时间:2012-08-30 15:07:39

标签: java data-structures hashtable java.util.concurrent

来自ConcurrentHashMap的Javadocs:

  

更新操作之间允许的并发性由   可选的concurrencyLevel构造函数参数(默认为16),即   用作内部尺寸的暗示。

我不明白“哪个用作暗示内部尺寸”的部分。 。这是什么意思 ?设置此值的最佳做法是什么?它给我们提供了什么保证?

2 个答案:

答案 0 :(得分:3)

看看Javadoc中的下一句话:

  

该表在内部分区以尝试允许指示    没有争用的并发更新数。因为安置    在散列表中基本上是随机的,实际的并发性    变化。理想情况下,您应该选择一个值来容纳尽可能多的值    线程将同时修改表。用一个    比你需要的价值高得多可以浪费空间和时间,    并且显着较低的值可能导致线程争用。但    过高估计和低估了一个数量级    通常不会产生明显的影响。值为1    适当的时候知道只有一个线程会修改和    所有其他人只会阅读。此外,调整此或任何其他类型    哈希表是一个相对较慢的操作,因此,如果可能,它是    一个好主意,提供预期表格大小的估计    构造

换句话说,concurencyLevel为16意味着ConcurrentHashMap在内部创建了16个单独的哈希表来存储数据。修改一个哈希表中的数据的操作不需要锁定其他哈希表,这允许对整个Map进行某种程度的并发访问。

您可能想尝试阅读the source of ConcurrentHashMap

答案 1 :(得分:0)

并发级别大约相等,可以在不使用内部锁定机制的情况下同时调用map上的多少个操作。正如maat b所说,ConcurrentHashMap将有N个内部哈希表,因此处理不同哈希表的操作不需要额外的锁定 - 否则如果操作在相同的内部哈希表上工作,那么ConcurrenyHashMap会对它们使用额外的内部锁定。