我已经在某个问题上抓挠了一段时间,虽然环顾四周,但未能找到答案。我想知道如果concurrencyLevel
大于地图的capacity
会发生什么。
默认情况下两者均为16,这意味着每个存储桶将具有一个锁。如果capacity
为32和concurrencyLevel
16,则将在2个存储桶上保留一个锁。但是,当concurrencyLevel
为32而capacity
为16时会发生什么呢?
每个存储桶都会被2个锁锁住吗,如果concurrencyLevel
和capacity
的分布不均匀(例如24和16)或类似的情况会怎样?
最佳答案
没什么特别的。您是否检查了ConcurrentHashMap
的文档?它说:“此外,为了与此类的早期版本兼容,构造函数可以选择指定期望的concurrencyLevel
作为内部调整的附加提示。”这是一个提示,而不是限制。此外,在concurrencyLevel
上:“并发更新线程的估计数量。实现可能将此值用作大小调整提示。”注意:“可以”。因此,如果发生任何事情,大小将变得不同。也许。
如果需要进一步的实现细节,可以研究源代码。可用。在Java 1.8中,它包含以下两行:
if (initialCapacity < concurrencyLevel) // Use at least as many bins
initialCapacity = concurrencyLevel; // as estimated threads