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

时间:2015-09-01 12:20:12

标签: java collections hashmap concurrenthashmap

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

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

1 个答案:

答案 0 :(得分:7)

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

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