1.5 版后的 Volatile 关键字行为

Volatile keyword behavior after version 1.5

this tutorialJavavolatile Happens-Before Guarantee部分,关于happens-before规则有一句话:

The reading and writing instructions of volatile variables cannot be reordered by the JVM (the JVM may reorder instructions for performance reasons as long as the JVM detects no change in program behaviour from the reordering).

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

指令可以重新排序以确保流水线不会停止。假设您有一系列指令,并且每条指令都以某种方式依赖于前一条指令。然后处理器无法并行执行这些指令,因为每个指令(从获取、解码、执行和存储)周期的执行阶段(有时甚至是解码阶段)将取决于前一条指令的执行阶段,因此会出现气泡或 nop (无操作)需要介绍

为了防止这种情况,JVM 或硬件可以重新排序指令,这样对先前指令的依赖不会通过在其间执行一些其他非依赖指令而使流水线停止。这样做是 JVM 或硬件的工作,以确保重新排序指令不会以任何方式改变顺序执行的程序的行为。

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

JVM 可以通过添加围栏指令来防止指令重新排序,围栏指令会阻止优化围栏周围的指令。