gpt4 book ai didi

java - Java 的 Atomic* 类中的 lazySet 是如何实现的?

转载 作者:塔克拉玛干 更新时间:2023-11-03 03:50:45 25 4
gpt4 key购买 nike

this video关于Disruptor ,一个并发框架,提到了 Java 的 Atomic* 类(例如 AtomicLong)的 lazySet 方法。根据documentation ,此方法“最终设置为给定值”。

有谁知道实现它的底层机制是什么(特别是在 Windows 上的 x86 上,如果相关的话)。不可能是InterlockedExchange() ,因为这会设置值并确保在返回之前刷新缓存行,如果我没记错的话。

最佳答案

这基本上调用了 unsafe.putOrderedLong(),这是一个原生函数。基于 ordered(惰性)与 volatile(立即)之间的不安全区分。我几乎确定(惰性)版本只是解析为 storestore,而 volatile 需要更昂贵的 loadstore。这保留了线程语义(对于设置线程),而不会停止所有其他内核。最终读者会获得新的值(value)。

[编辑:也就是说(这是推测性的),我确定惰性存储使用的是“更轻”的内存防护,如果平台提供的话,完全 volatile 使用的内存防护。例如。我没有看到你不能在 C# 中做同样的事情,比如 x86]

像这样的东西的典型用途是计数器(比如队列深度)。如果您在每次迭代中都遇到了 volatile,那么它不会是“高性能”的,因为您会在每次迭代中承担缓存一致性的全部成本。如果您的并发交互允许“模糊”读数,那么您的(通过内存交互)那么这种技术会降低维护整个系统状态的成本(在可接受的误差范围内,例如,您的队列深度读数有点偏差。)

[附注/编辑:discussion of fencing by Distruptor's designers .]

关于java - Java 的 Atomic* 类中的 lazySet 是如何实现的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8381440/

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