我已经在一个问题上摸不着头脑了一段时间,我环顾四周但却未能找到答案。我想知道如果concurrencyLevel
大于地图的capacity
会发生什么。
默认情况下,两者都是16,这意味着每个存储桶都有一个锁。如果capacity
为32且concurrencyLevel
16,则锁定将保存在2个存储桶上。但是当concurrencyLevel
为32且capacity
为16时会发生什么?
每个桶是否由2个锁定,如果concurrencyLevel
和capacity
的分布不均匀,如24和16,或者其他什么,会发生什么?
答案 0 :(得分:5)
没有什么特别的事情发生。您查看了ConcurrentHashMap
的文档了吗?它说:“另外,为了与此类的先前版本兼容,构造函数可以选择指定预期的concurrencyLevel
作为内部大小调整的附加提示。”这是一个提示,而不是限制。此外,在concurrencyLevel
:“估计并发更新线程的数量。实现可以使用此值作为大小提示。“注意:”可以“。因此,如果发生任何事情,大小会变得不同。也许
如果您想了解更多实施细节,可以学习源代码。它可用。在Java 1.8中,它包含以下两行:
if (initialCapacity < concurrencyLevel) // Use at least as many bins
initialCapacity = concurrencyLevel; // as estimated threads