Java 什么';getVolatile和getAcquire之间的区别是什么?
Java 什么';getVolatile和getAcquire之间的区别是什么?,java,jls,Java,Jls,getVolatile与使用例如时有什么区别 附言:这些都与 与edge同步的源称为释放,而 目的地称为获取 从这一切又回到了我们希望如何优化代码。在重新订购代码方面进行优化。编译器可能会重新排序以进行优化getAquire确保它后面的指令不会在它之前执行。这些指令可能会被重新排序,但它们总是在getAquire之后执行 这与setRelease(用于VarHandle)结合使用,其中setRelease确保在它之前发生的事情不会被重新排序为在它之后发生 例如: Thread1: va
getVolatile
与使用例如时有什么区别
附言:这些都与
与edge同步的源称为释放,而
目的地称为获取
从这一切又回到了我们希望如何优化代码。在重新订购代码方面进行优化。编译器可能会重新排序以进行优化
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变量一样。没有进行重新排序或优化
这是一个很好的理解,即所谓的“内存排序模式”是简单的、不透明的、释放/获取的和易失性的