gpt4 book ai didi

java - 在读取 volatile 变量之前,机器能否获得其他变量的可见性?

转载 作者:行者123 更新时间:2023-12-01 19:11:22 24 4
gpt4 key购买 nike

我知道 volatile 可以改变可见性,所以我可以读取 b,但是为什么如果我把 b=null 放在 a = null 之前,运行主体就不会通过break结束,在访问 volatile 变量a之前可以看到b=null

public class VolatileObjectTest4 implements Runnable {

public volatile Object a;
public Object b = new Object();
public Object c;

public VolatileObjectTest4(Object a) {
this.a = a;
}

@Override
public void run() {
long i = 0;
while (b != null) {
//c = a;i=1;
if (a == null) { //if i comment the next four lines, the loop won't break ,if i read the volatile `a`, the loop absolutely break;
i = 1;
break;
}
i++;
}
System.out.println("stop My Thread " + i);
}

public void stop() {
System.out.println("stop");
//b = null; // if comment this line, i = 1
a = null;
b = null; // if comment this line, i != 1

}

public static void main(String[] args) throws InterruptedException {

VolatileObjectTest4 test = new VolatileObjectTest4(new Object());
new Thread(test).start();

Thread.sleep(1000);
test.stop();
Thread.sleep(1000);
System.out.println("Main Thread " + test.getA() + test.c);
}

}

最佳答案

stop() 中的空赋值可能发生在 run() 期间的任何位置。对它们进行排序不会改变循环中断的随机性。你可以对两个方法都断点并单步执行所有组合来证明这一点,它与 volatile 关系不大。

volatile 可能创建了一个内存屏障来强制出现“之前发生”的情况(防止编译器重新排序指令),但这仍然可能导致您所观察到的情况。

关于java - 在读取 volatile 变量之前,机器能否获得其他变量的可见性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59479149/

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