lazySet在Java中的表现如何;实现了哪些原子*类?

lazySet在Java中的表现如何;实现了哪些原子*类?,java,concurrency,Java,Concurrency,在大约一个并发框架中,提到了Java原子类(例如AtomicLong)的lazySet方法。根据,该方法“最终设置为给定值” 有人知道实现这一点的底层机制是什么吗(特别是在Windows上的x86上,如果相关的话)。不可能,因为如果我没有弄错的话,这将设置值并确保在返回之前刷新缓存线。这基本上调用了不安全的.putOrderedLong(),这是一个本机函数。基于在“不安全”中区分有序(惰性)和易失性(即时)。我几乎可以肯定,(lazy)版本只是解析为storestore,而volatile需要

在大约一个并发框架中,提到了Java原子类(例如AtomicLong)的lazySet方法。根据,该方法“最终设置为给定值”


有人知道实现这一点的底层机制是什么吗(特别是在Windows上的x86上,如果相关的话)。不可能,因为如果我没有弄错的话,这将设置值并确保在返回之前刷新缓存线。

这基本上调用了不安全的.putOrderedLong(),这是一个本机函数。基于在“不安全”中区分有序(惰性)和易失性(即时)。我几乎可以肯定,(lazy)版本只是解析为
storestore
,而volatile需要更昂贵的
loadstore
。这将保留线程语义(用于设置线程),而不会停止所有其他内核。最终读者会发现新的价值观

[编辑:也就是说(这是推测性的),我确信lazy store使用的是完全volatile所使用的“更轻”的内存隔离——如果平台提供的话。例如,我不知道在C#中有什么不能做的,比如说在x86中]

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


[p.s./编辑:.]

在以下内容中找到此实施说明:

语义是保证写操作不会以任何形式重新排序 上一次写入,但可能会随后续操作重新排序 (或等效地,其他线程可能看不到)直到 发生其他一些易失性写入或同步操作)

对于喜欢从以下方面考虑这些操作的人: 在常见的多处理器上,lazySet提供了一个 之前的门店壁垒(要么是禁止运营,要么是非常便宜 在当前平台上),但没有存储负载屏障(通常是 易失性写入的昂贵部分)


我想OP会问lazySet使用什么样的记忆围栏。很明显,记忆屏障较弱。