Java ConcurrentHashMap为什么要锁定段?

Java ConcurrentHashMap为什么要锁定段?,java,Java,ConcurrentHashMap通过锁定段而不是锁定整个映射来进行优化。想知道为什么它不能锁定密钥以获得更好的性能。基本上,Segment=HashCodeHashCodes对于每个键不是唯一的(两个不同的键可以具有相同的HashCode),并且HashMaps基于HashCode存储 现在,您不必太担心它的实现,但基本上,每个段都是独立空间的最小单位,即,更改/删除/添加段中的项可能会影响对该段的其他访问 所以段被锁定,因为它是最小的空间单元,对于所有可能的访问情况都是安全的 您无法知道密钥

ConcurrentHashMap通过锁定段而不是锁定整个映射来进行优化。想知道为什么它不能锁定密钥以获得更好的性能。

基本上,
Segment=HashCode
HashCodes
对于每个键不是唯一的(两个不同的键可以具有相同的
HashCode
),并且
HashMaps
基于
HashCode
存储

现在,您不必太担心它的实现,但基本上,每个段都是独立空间的最小单位,即,更改/删除/添加段中的项可能会影响对该段的其他访问

所以段被锁定,因为它是最小的空间单元,对于所有可能的访问情况都是安全的

  • 您无法知道密钥的同步策略。锁定密钥可能会导致意外行为和死锁,因为用户代码已经锁定了密钥

  • 您可以像对待内部
    HashMap
    一样对待只服务于哈希代码子集的段。它需要有效地访问元素。因此,您应该阻止对整个结构的访问,而不仅仅是一个键。否则,由于非同步修改,可能会导致内部数据结构损坏


  • 两个不同的键/值对可以存储在同一段中。另外,两个具有相同哈希代码的不同对象都可以用作同一条目的键,但锁定其中一个不会影响另一条。您应该将其转换为答案。@JohnBollinger只有当
    .equals()
    返回true时,这才是真的,否则,它们是同一段中的两个键;它不使用分段。