当前位置: 首页 > 面试题库 >

理论上,ConcurrentHashMap的Segment和HashMap的存储桶有什么区别?

爱海
2023-03-14
问题内容

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

  1. 我可以将此概念与ConcurrentHashMap的概念进行关联,但不是存储桶,而是各个线程具有锁的段。而不是条目,有HashEntry(ies)。以类似的方式,创建了一个链表,如果要插入的“键-值”对不同,则基于键的equals()将其放置在链表的末尾。
  2. 我说的是对的:CHM的put不同步,因此任何线程都可以访问此方法,此put方法计算传递给它的键的哈希值并获取段索引(类似于存储桶的Kinda)。然后仅针对该段,它调用put方法。现在在Segment下,put方法指定将有一个lock(),以便只有一个线程可以更改特定段中的数据,因此得出结论,如果并发级别为16,则将有16个线程,因此这些线程将是能够 PUT 在时间值只有一个段。

问题答案:
  1. 值区是地图阵列中的单个插槽。这是两个相同的HashMapConcurrentHashMap。从概念上讲,后者将其数组分为多个段(每个段是一个引用数组),仅此而已。请注意,Java 8中的CHM不再具有段,而全都是单个数组。

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



 类似资料:
  • hashmap和hashtable在理论上有区别吗? 我不是指Java(或实现)中给出的具体定义,而是理论上的。哈希表不是使用哈希的地图吗...因此是hashmap?

  • 问题内容: 在的实现细节中,我可以阅读: 如果我有恒常的能力,而我的班级没有实现,它将如何打破束缚以及如何构造树呢? 我的意思是- 铲斗会变成一棵树,并会打断领带。然后,我将尝试使用其他实例(具有和)相同的实例来调用方法,它将具有不同的实例,因此是否有可能树被错误的节点遍历(向左而不是向右)并且找不到键? 我是否缺少某些东西,或者这是正常现象? 问题答案: 存储桶将在插入期间使用,但查找仅使用哈希

  • 问题内容: 我有一个地图,该地图将同时被多个线程修改。 Java API中似乎有三种不同的同步Map实现: Hashtable Collections.synchronizedMap(Map) ConcurrentHashMap 据我了解,这是一个旧的实现(扩展了过时的类),后来对其进行了修改以适合该Map接口。虽然它是同步的,但似乎存在严重的可伸缩性问题,因此不建议用于新项目。 但是其他两个呢?

  • 问题内容: 我开始学习Java。什么时候可以在TreeMap上使用HashMap? 问题答案: 是一个的示例,这意味着可以对键的顺序进行排序,并且在对键进行迭代时,可以期望它们会按顺序排列。 另一方面,不作任何保证。因此,当遍历a的键时,您无法确定它们将以什么顺序排列。 一般而言,它会更有效,因此只要您不关心键的顺序,都可以使用它。

  • 问题内容: 我看到了许多有关多图的示例,但不明白为什么Google Gauva与众不同? 两者在保存数据方面是相同的还是不同的? 问题答案: A 将类型A的键与类型的值相关联(因此名称为MultiMap) A 将类型A的键与类型B的值关联。 因此,可以将a视为。通过阅读api文档,这应该显而易见。

  • 问题内容: ava中的aHashMap和a有什么区别Hashtable? 对于非线程应用程序,哪个更有效? 问题答案: 和在Java中有一些区别: 是同步的,而HashMap不是。这HashMap对于非线程应用程序更好,因为非同步对象的性能通常优于同步对象。 不允许null键或值。 HashMap允许一个null键和任意数量的null值。 的子类之一是LinkedHashMap,因此,如果您想要可