我知道在HashMap中,条目(Key,Value)基于hash(Key.hashCode
)--> 表示存储桶位置的索引。如果条目已放置在该位置,则会创建一个链接列表和新条目(如果它有不同的键 --> 通过equals()
method) 被放置在链表的开头。
- 我可以将这个概念与 ConcurrentHashMap 的概念联系起来吗?但不是 Bucket,而是各个线程拥有锁的 Segment。并且不是 Entries,而是 HashEntry。以类似的方式,创建一个链表,如果插入的键值对不同,则基于
equals()
的键,它被放置在链表的末尾。
- 我这样说是否正确:
put
CHM 不是同步的,因此任何线程都可以访问该方法,该 put 方法计算传递给它的键的哈希值并获取段索引(有点像桶)。然后仅对于该段,它调用put
方法。现在在细分下,put
方法指定将会有一个lock()
,这样只有一个线程可以更改特定段中的数据,从而得出结论,如果并发级别为 16,则应有 16 个线程,因此这些线程将能够PUT一次仅值一个段。
桶是映射数组中的一个单独的槽。这两者都是一样的HashMap
and ConcurrentHashMap
。从概念上讲,后者的数组分为多个段(每个段都是一个引用数组),但仅此而已。请注意,Java 8 中的 CHM 不再具有段,而是一个数组。
是的,这就是所谓的计划分段锁定。它减少了线程间争用,但并没有消除它。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)