volatile
Object引用之间是否有任何区别AtomicReference
,如果我只使用get()
和set()
-methods AtomicReference
?
在试图了解SubmissionPublisher
(Java SE 10 中的源代码,OpenJDK | docs),在版本 9 中添加到 Java SE 的新类是如何实现的,我偶然发现了一些VarHandle
我以前不知道的API 调用:
fullFence
,acquireFence
,releaseFence
,loadLoadFence
和storeStoreFence
。
在做了一些研究之后,特别是关于内存屏障/栅栏的概念(我以前听说过它们,是的;但从未使用过它们,因此对它们的语义非常不熟悉),我想我对它们的用途有了基本的了解. 尽管如此,由于我的问题可能源于误解,我想确保我首先做对了:
内存屏障是关于读写操作的重新排序约束。
内存屏障可以分为两大类:单向和双向内存屏障,这取决于它们是否对读取或写入或两者都设置了约束。
C++ 支持多种内存屏障,但是,这些与VarHandle
. 然而,一些在可用内存壁垒VarHandle
提供排序的影响是兼容其相应的C ++内存屏障。
#fullFence
兼容 atomic_thread_fence(memory_order_seq_cst)
#acquireFence
兼容 atomic_thread_fence(memory_order_acquire)
#releaseFence
兼容 atomic_thread_fence(memory_order_release)
#loadLoadFence
并且#storeStoreFence
没有兼容的 C++ 计数器部分兼容这个词在这里似乎非常重要,因为在细节方面语义明显不同。例如,所有 C++ 屏障都是双向的,而 Java 的屏障不是(必然)。
我的假设正确吗?如果是这样,我产生的问题是:
可用的内存屏障是否VarHandle
会导致任何类型的内存同步? …
java concurrency memory-model java-memory-model memory-barriers
我有一套xchg
基于测试的装配锁.我的问题是:
使用指令时是否需要使用内存防护(mfence
,sfence
或lfence
)xchg
?
编辑:
64位平台:采用Intel nehalem
JLS 的内存模型部分(17.4)以合理的细节描述了volatile
非volatile
读写的语义,以及与某些其他结构(如监视器进入和退出)的交互.
然而,这并不能完全解释的语义compareAndSwap
,也不lazySet
在java.util.concurrent.atomic中*类.因为compareAndSet
,你有javadoc包中的blurb :
compareAndSet and all other read-and-update operations such as getAndIncrement
have the memory effects of both reading and writing volatile variables.
Run Code Online (Sandbox Code Playgroud)
lazySet
提供了一些更难以理解的模糊:
lazySet has the memory effects of writing (assigning) a volatile variable
except that it permits reorderings with subsequent (but not previous)
memory actions that do not themselves impose reordering constraints with
ordinary non-volatile writes. Among other usage contexts, lazySet may …
Run Code Online (Sandbox Code Playgroud) 来自这个问题:AtomicInteger lazySet vs. set并形成此链接:https://docs.oracle.com/javase/7/docs/api/java/util/concurrent/atomic/package-summary.html
我可以收集以下几点
我可以从文档中找到一个可以应用它的用例:
lazySet 还有其他实际用例吗?