Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/306.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java ConcurrentHashMap的段和HashMap的桶理论上有什么区别?_Java_Collections_Hashmap_Concurrenthashmap - Fatal编程技术网

Java ConcurrentHashMap的段和HashMap的桶理论上有什么区别?

Java ConcurrentHashMap的段和HashMap的桶理论上有什么区别?,java,collections,hashmap,concurrenthashmap,Java,Collections,Hashmap,Concurrenthashmap,我知道在HashMap中,条目(Key,Value)是基于hash(Key.hashCode)-->表示bucket位置的索引放置在bucket中的。如果某个条目已放置在该位置,则会创建一个链表,并将新条目(如果它具有不同的键-->通过equals()方法)放置在链表的开头 我可以将这个概念与ConcurrentHashMap的概念联系起来吗?但是,除了bucket之外,还有一些段,每个线程都有一个锁。这里没有条目,而是HashEntry。以类似的方式,将创建一个链表,如果插入的键值对不同,则基

我知道在HashMap中,条目(Key,Value)是基于hash(Key.hashCode)-->表示bucket位置的索引放置在bucket中的。如果某个条目已放置在该位置,则会创建一个链表,并将新条目(如果它具有不同的键-->通过equals()方法)放置在链表的开头

  • 我可以将这个概念与ConcurrentHashMap的概念联系起来吗?但是,除了bucket之外,还有一些段,每个线程都有一个锁。这里没有条目,而是HashEntry。以类似的方式,将创建一个链表,如果插入的键值对不同,则基于键的equals(),将其放置在链表的末尾
  • 我说的对吗: CHM的put是不同步的,因此任何线程都可以访问此方法,此put方法计算传递给它的密钥的哈希值,并获取段索引(类似于bucket)。然后仅对该段调用put方法。现在在Segment下,put方法指定将有一个lock(),因此只有一个线程可以更改特定段中的数据,从而得出结论,如果并发级别为16,则将有16个线程,因此这些线程一次只能放置一个段的值
  • bucket是地图数组中的单个插槽。这与
    HashMap
    ConcurrentHashMap
    都是一样的。从概念上讲,后者将其数组分为多个段(每个段都是一个引用数组),但仅此而已。注意,Java8中的CHM不再有段,而是一个数组

  • 是的,这就是所谓的分段锁定方案。它减少了线程间争用,但并没有消除它


  • 这可能对pt有帮助。1在您的回答中:这是否意味着CHM中的桶也被划分?在这些段下有HashEntry链表?不能分割存储桶,它们是链表。一个段是一个bucket数组,每个map实例只有多个。但是我在代码中看到的结构是这样的:CHM有一个段的实例,segment有一个HashEntry实例,bucket在哪里出现在图片中我猜你看到错了,这两个都是数组。和段=HashEntry的数组。一个HashEntry=一个bucket。这是否清晰了你的视野?