gpt4 book ai didi

java - ConcurrentHashMap 中段是如何定义的

转载 作者:行者123 更新时间:2023-12-01 09:23:51 25 4
gpt4 key购买 nike

friend 们大家好,我是 Java 并发的新手。我有以下两个问题。

Q.1 ConcurrentHashMap中的段是如何定义的?意味着如果该Map中有64个元素并且concurrencyLevel值为16(有16个线程可以同时工作)那么如何定义段?问题是它们是否都是大小相等的 16 个段,每个段有 4 个元素?或者它会是大小不等的段?

问题 2。如果我将 ConcurrentHashMap 定义为初始容量为 62,并发级别为 16。如果我在该映射中放入 62 个元素。根据我的理解,将有 15 个段,每个段有 4 个元素,第 16 个段将有 2 个元素?我在这里说得对吗?

提前致谢

最佳答案

将使用段(并非全部使用)的 ConcurrentHashMap 实现视为基本上是一个两级哈希表。给定一个键 K 和键 h = K.hashCode() 的哈希码,您首先使用 hhash 到包含 16 个段的数组中code>,就像普通的 HashMap 一样(例如,通过采用 h % 16 或类似的东西)。这将为您提供 key 所在的段,这只是另一个映射 - 再次使用 h 在此映射中查找 key 。

不同之处在于,任何锁定操作(通常发生在像 put() 这样的变异操作期间)只需要锁定所涉及的段,因此其他操作有机会并行进行。

具体回答您的问题:

第一季度

这些段的容量大小相同,但通常它们具有不同数量的元素,因为元素的段是使用散列来选择的,除非在特殊情况下,否则不会产生完全均匀的结果。这就像您询问 HashMap 中支持的数组的前半部分是否与后半部分具有相同数量的元素一样。 平均上,预期元素数量是相同的,但对于任何给定的 HashMap 来说,它完全不同由于随机变化,两半的元素数量相同。

第二季度

不, map 不会这样布局。如上所述,将元素选择为段是使用哈希完成的,这意味着(对于良好的哈希函数)段基本上是随机选择的。想象一下,您有一 jar 标记为 1 到 16 的球,您一次选择一个球,共 62 次,并在更换球之前记录下您得到的数字。您不会期望得到像 4, 4, 4, 4, 4, 4, 4, 4, 4, ... , 4, 2, 2] 这样的发行版!这样会更加随机。

关于java - ConcurrentHashMap 中段是如何定义的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39997574/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com