gpt4 book ai didi

java - 变量是否应该在 2 个正在运行的线程之间是 volatile 的?

转载 作者:行者123 更新时间:2023-12-03 12:44:57 25 4
gpt4 key购买 nike

在这种情况下,int a 是否应该是 volatile 以保证线程之间的可见性?

private volatile static int a = 0;

public static void main(String[] args) {

Thread t1 = new Thread(new Runnable() {

@Override
public void run() {
a = 10;
}
});


Thread t2 = new Thread(new Runnable() {

@Override
public void run() {
System.out.println(a);
}
});

t1.start();
t2.start();

}

输出

10

最佳答案

happens-before is clearly defined in the language specification ,从阅读开始;开始吧。

然后要完全了解发生了什么,您需要知道 Program order是,以及 synchronization order .

说的很简单,看下面:

private volatile static int a = 0;
private static int b = 0;

public static void main(String[] args) {

Thread t1 = new Thread(new Runnable() {

@Override
public void run() {
b = 100;
a = 10;
}
});


Thread t2 = new Thread(new Runnable() {

@Override
public void run() {
if(a == 10){
System.out.println(b);
}

}
});

t1.start();
t2.start();

}

您拥有的唯一保证是当且仅当 t2打印一些东西,它总是100 .这是因为 t2 见过一个volatile writea .发生这种情况是因为已经建立了“之前发生”,从写入线程到读取线程,以及在 a = 10 之前完成的每个操作。保证对看到 a 的线程可见正在 10 .

关于java - 变量是否应该在 2 个正在运行的线程之间是 volatile 的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66162939/

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