getVolatile
与 getAcquire 在使用时有什么区别,例如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 的。