gpt4 book ai didi

java - ConcurrentHashMap 中的 Dose Segment 存在虚假共享问题?

转载 作者:搜寻专家 更新时间:2023-10-31 19:44:27 24 4
gpt4 key购买 nike

java.util.concurrent.ConcurrentHashMap 使用 Segment 数组作为 Mutex 并且 Segment Object 小于缓存行。

这会导致虚假分享吗?

最佳答案

首先,最好区分 Java 7 中的 ConcurrentHashMap 和 Java 8 中的 ConcurrentHashMap,因为实现差异很大。

Java 7 中的 ConcurrentHashMap

Peter Lawrey 是正确的,Segment 类扩展了 ReentrantLock,它聚合了 AbstractQueueSynchronizer 的特化。 AbstractQueuedSynchronizer 本身包含足够的 long 字段来填充缓存行的通常填充长度(64 字节)。如果您计算一下,可能会发现 Segment 实际上占用 1 个缓存行 + 一点点,因此您可能会争辩说它容易受到错误共享的影响。 Java Object LayoutIntel VTune应该能够帮助您解决这个问题。

Java 8 中的 ConcurrentHashMap

在 Java 8 中,ConcurrentHashMap 不再依赖 strip 锁定。相反,它使用的是一种基本无锁的算法,该算法适用于桶的粒度级别(在新实现中称为 Node),而不是一组桶(称为 Segment)在旧的实现中)。如果您深入了解实现细节,您会注意到:

  1. 新的实现不太容易受到错误共享的影响,因为您希望不同的线程仅在发生存储桶冲突时才会访问同一个节点
  2. @Contended 注释用于 Java 8 的 ConcurrentHashMap 的内部实现中,因此 Doug Lea 和其他从事它工作的人确实一直在考虑虚假共享.它恰好用在您预计虚假共享最容易受到打击的地方 - 当您试图跟踪表格的大小时。

关于java - ConcurrentHashMap 中的 Dose Segment 存在虚假共享问题?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36169406/

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