【问题标题】:How ConcurrenthashMap manages if Concurrency level is HIGHER than the number of Buckets?如果并发级别高于桶数,ConcurrenthashMap 如何管理?
【发布时间】:2017-10-22 18:58:51
【问题描述】:

ConcurrentHashMap 使用段级锁定 机制来支持并发修改。它具有三个基本参数

  • 存储桶数。 (默认初始大小 = 16)
  • 并发级别。 (默认大小 = 16)
  • 负载系数。(默认大小 = 0.75)

在默认情况下,我们每个桶都有一个锁。如果桶数设为 32,那么我们将 每两个桶有一个锁

如果桶数少于并发级别,即如果

,如何管理
Map cMap = new ConcurrentHashMap(16,1,32); 

通常一个桶使用一个集合(链表)来存储在同一个桶中具有冲突代码的项目。在上述情况下,每个桶有两个锁吗,如果是,那么它是如何管理的(桶中的一半集合是否使用一个锁而另一半使用第二个锁?)

如果ConcurrentHashMap 的大小被调整为比锁的数量更多的桶,我已经搜索并能够看到答案,但如果是相反的情况,我无法得到答案,即:

如果并发级别高于桶数,ConcurrenthashMap 如何管理?

【问题讨论】:

    标签: java concurrenthashmap


    【解决方案1】:

    This code 在构造函数中应该回答你的问题:

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

    另见documentation

    concurrencyLevel 估计的并发更新线程数。实现可以将此值用作大小提示。

    【讨论】:

    • 我要学习ConcurrentHashMap的内部结构。谢谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-01-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-25
    相关资源
    最近更新 更多