当前位置: 首页 > 知识库问答 >
问题:

ConcurrentHashMap锁定

堵毅然
2023-03-14

我在某处读到过,在< code>ConcurrentHashmap中,整个Map对象没有被锁定,而是在Map的一部分上进行锁定。

有人能详细说明一下锁定是什么时候出现的吗?

读取地图时没有锁,而更新地图时只使用锁,这是对的吗?

共有3个答案

麻宜春
2023-03-14

并发HashMap使用可重入锁机制。并发HashMap使用段而不是桶,当新记录获取时,插入锁将仅在段上获取,而不是段的完整列表。所以这里的想法很清楚,多级锁将在同一条上获取。

由于没有明确设置并发级别,ConcurrentHashMap被分成16个部分。每个段充当一个独立的散列表。

ConcurrentHashMap中的读取操作没有应用锁。

谭仰岳
2023-03-14

锁定尽可能最小化,同时仍然保持线程安全。

为了解释“映射的一部分被锁定”,这意味着在更新时,只有映射的“1/并发级别”(基于密钥的哈希)被锁定。这意味着,如果两个更新各自影响单独的“存储桶”,则它们仍然可以同时安全执行,从而最大限度地减少锁争用,从而最大限度地提高性能。

更重要的是,信任JDK实现——您不必担心JDK中的实现细节(首先,它可能会随着版本的不同而变化)。相反,只需专注于编写代码。

盖锦程
2023-03-14

是的,ConcurrentHashMap 使用大量锁(默认情况下为 16 个锁),每个锁控制哈希的一个段。

在特定段中设置数据时,将获得该段的锁。

获取数据时,使用易失性读取。如果volatile读取导致未命中,则会在最后一次成功读取时获得段的锁。

 类似资料:
  • 问题内容: 我们遇到了一个奇怪的问题,其中似乎有两个线程正在调用,然后在方法内部永远等待。从外部看,内部看起来像是一个僵局。 到目前为止,我们只看到这种情况发生一次。 谁能想到任何可能导致这些症状的东西? 编辑 :相关线程的线程转储在这里: 问题答案: 可能不是您想要的答案,但这可能是JVM错误。看到 http://bugs.sun.com/bugdatabase/view_bug.do?bug_

  • seata版本:1.4.0,但1.4以下的所有版本也都有这个问题 问题描述:在一个全局事务中,一个分支事务上的纯查询操作突然卡住了,没有任何反馈(日志/异常),直到消费端RPC超时 问题排查 整个流程在一个全局事务中,消费者和提供者可以看成是全局事务中的两个分支事务,消费者 --> 提供者 消费者先执行本地的一些逻辑,然后向提供者发送RPC请求,确定消费者发出了请求已经并且提供者接到了请求 提供者

  • ConcurrentHashMap的原理是引用了内部的 Segment ( ReentrantLock )  分段锁,保证在操作不同段 map 的时候, 可以并发执行, 操作同段 map 的时候,进行锁的竞争和等待。从而达到线程安全, 且效率大于 synchronized。 但是在 Java 8 之后, JDK 却弃用了这个策略,重新使用了 synchronized+CAS。 弃用原因 通过  J

  • 这个代码是正确的还是性能更好?

  • 本文向大家介绍请你说明ConcurrentHashMap锁加在了哪些地方?相关面试题,主要包含被问及请你说明ConcurrentHashMap锁加在了哪些地方?时的应答技巧和注意事项,需要的朋友参考一下 考点:集合 加在每个Segment 上面。

  • 问题内容: Java 8中引入了一个新的computeIfAbsent API。ConcurrentHashMap 实现它的javadocs 状态如下: 如果指定的键尚未与值关联,则尝试使用给定的映射函数计算其值,除非为null,否则将其输入此映射。整个方法调用是原子执行的,因此每个键最多可应用一次该功能。在进行计算时,可能会阻止其他线程在此映射上进行的某些尝试的更新操作,因此计算应简短而简单,并