Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/jsp/3.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 1.5版之后的易失性关键字行为_Java_Volatile - Fatal编程技术网

Java 1.5版之后的易失性关键字行为

Java 1.5版之后的易失性关键字行为,java,volatile,Java,Volatile,在Java volatile Before guarance部分中,有一句话是关于Before规则的: JVM无法对易失性变量的读写指令进行重新排序(JVM可能出于性能原因对指令进行重新排序,只要JVM检测到重新排序后程序行为没有变化) 我的问题是JVM如何检测指令的重新排序。我们是否可以在任何地方编写任何示例、规范或注释,以便更好地理解由于指令重新排序而导致的JVM性能?我在网上找不到任何有用的东西。可以对指令重新排序,以确保管道不会停止。假设你有一系列指令,每一条指令在某种程度上取决于前一条

Java volatile Before guarance部分中,有一句话是关于Before规则的:

JVM无法对易失性变量的读写指令进行重新排序(JVM可能出于性能原因对指令进行重新排序,只要JVM检测到重新排序后程序行为没有变化)


我的问题是JVM如何检测指令的重新排序。我们是否可以在任何地方编写任何示例、规范或注释,以便更好地理解由于指令重新排序而导致的JVM性能?我在网上找不到任何有用的东西。

可以对指令重新排序,以确保管道不会停止。假设你有一系列指令,每一条指令在某种程度上取决于前一条指令。然后,处理器无法并行执行这些指令,因为每个指令(从提取、解码、执行和存储)周期的执行阶段(有时甚至是解码阶段)将取决于前一条指令的执行阶段,因此需要引入气泡或nop(无操作)

为了防止这种情况发生,JVM或硬件可以对指令进行重新排序,以便对先前指令的依赖不会通过执行中间的一些其他非依赖指令而暂停管道。在这样做的过程中,JVM或硬件的任务是确保重新排序的指令不会以任何方式改变程序的行为(如果按顺序执行)

volatile关键字保证在volatile写入之前写入的变量的状态(可以是非volatile的)对读取写入volatile变量的值的任何线程都可见。这就像同步,尽管它是一种较弱的形式。换句话说,volatile的使用保证了在写入volatile变量之前的任何内存写入不会在写入volatile变量之后重新排序。同样,保证在从易失性变量读取之前,不会对易失性读取之后的任何变量读取进行重新排序

JVM可以通过添加围栏指令防止对围栏周围的指令进行优化,从而防止指令重新排序