gpt4 book ai didi

java - 多线程 "unpredictable"行为

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

这个问题在这里已经有了答案:





Relationship between Threads and println() statements

(2 个回答)


6年前关闭。




我正在浏览 volatile 的用例,我遇到了以下场景:

private static boolean stop = false;
public static void main(String[] args) throws InterruptedException {
Thread runner = new Thread(new Runnable() {

@Override
public void run() {
int i = 0;
long start = System.currentTimeMillis();
while(!stop){
i++;
}
System.out.println("I m done after "+(System.currentTimeMillis() - start));
}
});

runner.start();
Thread.sleep(2000);
stop = true;
}

上面的代码无限期地运行。这很好,因为 吊装由编译器完成以尝试优化代码。但是,如果我替换, 我++ 与其他一些陈述,例如 System.out.println("你好") . 2 秒后停止。

为什么会有这样的行为?我正在使用 jdk1.7.0_51。

注:
我知道我应该将 stop 声明为 volatile。但是,我想知道上述情况下行为的原因。

最佳答案

标准输出是跨线程的共享资源。 Java的PrintStream使用同步块(synchronized block)使类成为线程安全的,并且所有同步块(synchronized block)都是 java 中的内存屏障,这就是 stop 上的更改的原因字段在循环内变得可见。但是,你不应该依赖这个。

例如,看看 PrintStream.println执行:

public void println(String paramString)
{
synchronized (this)
{
print(paramString);
newLine();
}
}

关于java - 多线程 "unpredictable"行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37114582/

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