gpt4 book ai didi

java - 在多线程程序中具有未同步访问的 Java 中的奇怪行为

转载 作者:搜寻专家 更新时间:2023-10-31 19:34:50 24 4
gpt4 key购买 nike

我更改了一个值,该值用于确定 while 循环何时在单独的线程中终止。
我不想知道如何让它工作。如果我仅通过同步的 getter/setter 访问变量测试,它会按预期工作。

我本以为,如果某些读/写命令由于并发而丢失,程序有时不会终止,但它从不 会终止。这就是让我感到困惑的原因..
我想知道为什么程序从不 在没有打印命令的情况下终止。我想了解为什么 print-command 会改变任何东西..

     

public class CustomComboBoxDemo {
public static boolean test = true;
public static void main(String[] args) {
Thread user =new Thread(){
@Override
public void run(){
try {
sleep(2000);
} catch (InterruptedException e) {}
test=false;
}
};
user.start();
while(test) {
System.out.println("foo"); //Without this line the program does not terminate..
}
}
}

最佳答案

最可能的解释是变量只被读取一次,将while 变成无限循环(或无操作)。由于您尚未将 test 声明为 volatile,因此允许编译器执行此类优化。

一旦您从循环内调用外部函数,编译器就无法再证明 test 在循环迭代中保持不变,并且不会执行优化。

关于java - 在多线程程序中具有未同步访问的 Java 中的奇怪行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8743917/

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