gpt4 book ai didi

java - 了解上下文切换期间的 Java 内存模型

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

最近在一次 session 演讲中,使用以下示例来演示多线程环境中的 Java 内存模型。

public class A {

public static boolean done;

public static void main(String[] args) throws InterruptedException {
done = false;
new Thread(new Runnable(){
public void run() {
System.out.println("running...");

int count = 0;
while (!done) {
count++;
}

System.out.println("Exiting thread");
}
}).start();

System.out.println("in main...");
Thread.sleep(2000);

System.out.println("setting done to true");
done = true;
}
}
我知道上面代码中创建的新线程永远不会退出,因为 done被缓存在 Thread 的本地缓存中的变量。一个合适的解决方案是制作 done可变的。
但是如果在 while 循环中,我们调用 Thread.sleep()如下
    while (!done) {
count++;
try {Thread.sleep(0);} catch(Exception e){}
}
然后线程成功退出。
我的理解是因为 sleep(0)将发生上下文切换,使缓存条目无效,因此每次更新的值 done被检索。我的理解正确吗?这种行为也取决于机器的核心数吗?

最佳答案

Java 语言规范 明确指出 Thread::sleep没有任何 发生在 语义(这些是你唯一想推理的):

... Thread.sleep nor Thread.yield have any synchronization semantics...


因此,规范不保证您“碰巧”看到使用它的任何输出。您唯一的保证是完成后是 volatile ,再次,因为 JLS 给你这样的保证。
您关于正确同步程序的推理必须支持 发生在 、上下文切换、缓存等都无关紧要。

关于java - 了解上下文切换期间的 Java 内存模型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66934089/

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