相关疑难解决方法(0)

Java易失性参考与AtomicReference

volatileObject引用之间是否有任何区别AtomicReference,如果我只使用get()set()-methods AtomicReference

java concurrency

130
推荐指数
4
解决办法
4万
查看次数

Java 中的内存栅栏是做什么用的?

在试图了解SubmissionPublisherJava SE 10 中的源代码,OpenJDK | docs),在版本 9 中添加到 Java SE 的新类是如何实现的,我偶然发现了一些VarHandle我以前不知道的API 调用:

fullFenceacquireFencereleaseFenceloadLoadFencestoreStoreFence

在做了一些研究之后,特别是关于内存屏障/栅栏的概念(我以前听说过它们,是的;但从未使用过它们,因此对它们的语义非常不熟悉),我想我对它们的用途有了基本的了解. 尽管如此,由于我的问题可能源于误解,我想确保我首先做对了:

  1. 内存屏障是关于读写操作的重新排序约束。

  2. 内存屏障可以分为两大类:单向和双向内存屏障,这取决于它们是否对读取或写入或两者都设置了约束。

  3. 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 的屏障不是(必然)。

  1. 大多数内存屏障也具有同步效应。那些特别依赖于其他线程中使用的屏障类型和先前执行的屏障指令。由于屏障指令的全部含义是特定于硬件的,因此我将坚持使用更高级别的 (C++) 屏障。例如,在 C++ 中,在释放屏障指令之前所做的更改对于执行获取屏障指令的线程是可见的。

我的假设正确吗?如果是这样,我产生的问题是:

  1. 可用的内存屏障是否VarHandle会导致任何类型的内存同步? …

java concurrency memory-model java-memory-model memory-barriers

21
推荐指数
1
解决办法
770
查看次数

使用xchg时我们需要mfence吗?

我有一套xchg基于测试的装配锁.我的问题是:

使用指令时是否需要使用内存防护(mfence,sfencelfence)xchg

编辑:

64位平台:采用Intel nehalem

c c++ x86 assembly memory-fences

8
推荐指数
3
解决办法
3158
查看次数

原子比较和交换是否可以覆盖惰性写入而不会看到它?

JLS 的内存模型部分(17.4)以合理的细节描述了volatilevolatile读写的语义,以及与某些其他结构(如监视器进入和退出)的交互.

然而,这并不能完全解释的语义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)

java concurrency java-memory-model jls

6
推荐指数
1
解决办法
153
查看次数

Java中AtomicXXX上lazySet的用法

来自这个问题:AtomicInteger lazySet vs. set并形成此链接:https://docs.oracle.com/javase/7/docs/api/java/util/concurrent/atomic/package-summary.html

我可以收集以下几点

  • lazySet 可能比 set 更快
  • lazySet 使用存储-存储屏障(尊重之前的写入,但不尊重尚未发生的竞争写入)

我可以从文档中找到一个可以应用它的用例:

  • 当您想要清空指针以帮助 GC 时,请使用lazySet。

lazySet 还有其他实际用例吗?

java concurrency java.util.concurrent

2
推荐指数
1
解决办法
1119
查看次数