gpt4 book ai didi

java - 为什么 volatile 不能正常工作

转载 作者:行者123 更新时间:2023-12-02 11:07:23 24 4
gpt4 key购买 nike

今天,我使用 TimerTask 创建一个超时作业,但遇到了一个新问题,我有一个 static volatile boolean 变量 flag。我的理解是,一旦该变量的值发生更改,所有正在运行的线程都会通知它。但是当我运行这个程序时,我得到了以下输出,这是 Not Acceptable 。

O/P:

--------------
--------------
DD
BB
Exiting process..
CC

我的期望是我的最后一次打印应该是退出进程..为什么会出现这种奇怪的行为?

我的代码是:

public class TimeOutSort {

static volatile boolean flag = false;

public static void main(String[] args) {

Timer timer = new Timer();
timer.schedule(new TimerTask() {

@Override
public void run() {

flag = true;
System.out.println("Exiting process..");
// System.exit(0);
}
}, 10 * 200);

new Thread(new Runnable() {

@Override
public void run() {
while (!flag)
System.out.println("BB");

}
}).start();

new Thread(new Runnable() {

@Override
public void run() {
while (!flag)
System.out.println("CC");

}
}).start();

new Thread(new Runnable() {

@Override
public void run() {
while (!flag)
System.out.println("DD");

}
}).start();
}

}

编辑:我怎样才能做到这一点?

最佳答案

volatile几乎意味着每次线程访问变量时,它必须确保使用每个线程可见的版本(即没有每线程缓存)。

不会强制 CC 打印线程在 flag 之后立即真正运行。已设置为true 。完全有可能(特别是在单核计算机上)一个线程设置标志并在 CC 打印线程有机会运行之前打印消息。/p>

另外:请注意打印到 System.out涉及获取锁(println() 调用内的某处),这可以修改测试代码的多线程行为。

关于java - 为什么 volatile 不能正常工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11670530/

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