我已经在某个问题上抓挠了一段时间,虽然环顾四周,但未能找到答案。我想知道如果concurrencyLevel大于地图的capacity会发生什么。

默认情况下两者均为16,这意味着每个存储桶将具有一个锁。如果capacity为32和concurrencyLevel 16,则将在2个存储桶上保留一个锁。但是,当concurrencyLevel为32而capacity为16时会发生什么呢?

每个存储桶都会被2个锁锁住吗,如果concurrencyLevelcapacity的分布不均匀(例如24和16)或类似的情况会怎样?

最佳答案

没什么特别的。您是否检查了ConcurrentHashMap的文档?它说:“此外,为了与此类的早期版本兼容,构造函数可以选择指定期望的concurrencyLevel作为内部调整的附加提示。”这是一个提示,而不是限制。此外,在concurrencyLevel上:“并发更新线程的估计数量。实现可能将此值用作大小调整提示。”注意:“可以”。因此,如果发生任何事情,大小将变得不同。也许。

如果需要进一步的实现细节,可以研究源代码。可用。在Java 1.8中,它包含以下两行:

    if (initialCapacity < concurrencyLevel)   // Use at least as many bins
        initialCapacity = concurrencyLevel;   // as estimated threads

09-26 15:47