Java ConcurrentHashMap为什么要锁定段?
ConcurrentHashMap通过锁定段而不是锁定整个映射来进行优化。想知道为什么它不能锁定密钥以获得更好的性能。基本上,Java ConcurrentHashMap为什么要锁定段?,java,Java,ConcurrentHashMap通过锁定段而不是锁定整个映射来进行优化。想知道为什么它不能锁定密钥以获得更好的性能。基本上,Segment=HashCodeHashCodes对于每个键不是唯一的(两个不同的键可以具有相同的HashCode),并且HashMaps基于HashCode存储 现在,您不必太担心它的实现,但基本上,每个段都是独立空间的最小单位,即,更改/删除/添加段中的项可能会影响对该段的其他访问 所以段被锁定,因为它是最小的空间单元,对于所有可能的访问情况都是安全的 您无法知道密钥
Segment=HashCode
HashCodes
对于每个键不是唯一的(两个不同的键可以具有相同的HashCode
),并且HashMaps
基于HashCode
存储
现在,您不必太担心它的实现,但基本上,每个段都是独立空间的最小单位,即,更改/删除/添加段中的项可能会影响对该段的其他访问
所以段被锁定,因为它是最小的空间单元,对于所有可能的访问情况都是安全的
HashMap
一样对待只服务于哈希代码子集的段。它需要有效地访问元素。因此,您应该阻止对整个结构的访问,而不仅仅是一个键。否则,由于非同步修改,可能会导致内部数据结构损坏两个不同的键/值对可以存储在同一段中。另外,两个具有相同哈希代码的不同对象都可以用作同一条目的键,但锁定其中一个不会影响另一条。您应该将其转换为答案。@JohnBollinger只有当
.equals()
返回true时,这才是真的,否则,它们是同一段中的两个键;它不使用分段。