Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/344.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 什么';getVolatile和getAcquire之间的区别是什么?_Java_Jls - Fatal编程技术网

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变量一样。没有进行重新排序或优化

这是一个很好的理解,即所谓的“内存排序模式”是简单的、不透明的、释放/获取的和易失性的