从理论上讲,ConcurrentHashMap的Segment和HashMap的桶之间有什么区别?

Jat*_*hoo 4 java collections hashmap concurrenthashmap

据我所知,在HashMap中,条目(Key,Value)基于散列(Key.hashCode)放置在桶中 - >表示桶位置的索引.如果条目已经放置在该位置,则创建链接列表,并且新条目(如果它具有不同的键 - >通过equals()方法)放置在链接列表的开头.

  1. 我可以将这个概念与ConcurrentHashMap的概念联系起来,但是不是Buckets,而是有各个线程锁定的段.而不是条目,有HashEntry(ies).以类似的方式,创建链接列表,如果插入的键值对不同,则基于键的equals(),它被放置在链表的末尾.
  2. 我说的是正确的:CHM的put是不同步的,因此任何线程都可以访问这个方法,这个put方法计算传递给它的密钥的哈希值并得到段索引(有点像桶).然后,仅针对该段,它调用put方法.现在在Segment下,put方法指定会有一个lock(),这样只有一个线程可以改变特定段中的数据,从而得出结论,如果并发级别为16,则应该有16个线程,因此这些线程将是能够一次仅PUT值一个段.

Mar*_*nik 7

  1. 存储桶是地图阵列中的单个插槽.这是两个相同的HashMapConcurrentHashMap.从概念上讲,后者将其数组分成若干段(每个段是一个引用数组),但就是这样.请注意,Java 8中的CHM不再具有段,它们都是单个数组.

  2. 是的,这是被称为分段锁定的方案.它减少了线程间的争用,但并没有消除它.

  • Segment = HashEntry的数组.一个HashEntry =一个桶.这清楚了你的愿景吗? (3认同)