gpt4 book ai didi

java - 1.5 版后的 Volatile 关键字行为

转载 作者:塔克拉玛干 更新时间:2023-11-02 19:54:05 25 4
gpt4 key购买 nike

this tutorialJava volatile 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 (no-operation)需要引入。

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

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

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

关于java - 1.5 版后的 Volatile 关键字行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36807380/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com