getVolatilegetAcquire 在使用时有什么区别,例如AtomicInteger ?

PS:那些与



来自 https://docs.oracle.com/javase/specs/jls/se8/html/jls-17.html#jls-17.3

最佳答案

这一切都回到我们希望如何优化我们的代码。重新排序代码方面的优化。编译器可能会重新排序以进行优化。 getAquire 确保它后面的指令不会在它之前执行。这些指令可能会重新排序,但它们将始终在 getAquire 之后执行。

这与 setRelease (用于 VarHandle )结合使用,其中 setRelease 确保在它之后发生的事情不会重新排序。

例子:

Thread1:

    var x = 1;
    var y = 2;
    var z = 3;

    A.setRelease(this, 10)

x、y 和 z 的赋值将在 A.setRelease 之前发生,但可能会自行重新排序。
Thread 2:

if (A.getAquire(this) == 10) {
  // we know that x is 1, y is 2 and z = 3
}

这是并发程序的一个很好的用例,您不必在所有内容上施加波动性,而只需要在另一个指令之前执行一些指令。

对于 getVolatile ,该变量的处理方式与 Java 中的任何 volatile 变量一样。没有发生重新排序或优化。

这个 video 很高兴理解所谓的“内存排序模式”是简单的、不透明的、释放/获取和 volatile 的。

10-07 22:48