gpt4 book ai didi

Java:while 循环中的 For 循环不会运行,除非包含 println 语句

转载 作者:行者123 更新时间:2023-12-03 11:18:54 26 4
gpt4 key购买 nike

我正在尝试在无限 while 循环中运行 for 循环。当没有打印语句时,代码不会按预期运行,但是当有打印语句时,它运行良好。这是代码:

class Test implements Runnable{
public static int varint = 0;
public static void main(String args[]){
Thread x = new Thread(new Test());
int i;
x.start();
while(true){
System.out.println("Hello World"); //If this isn't included,
//the exit statement isn't executed
for(i=0;i<varint;i++){
System.out.println("Exit");
System.exit(0);
}
}
}

public void run(){
try{
Thread.sleep(5000);
} catch(Exception e){
System.out.println("Caught");
}
varint = 1;
}
}
这只是从更大的循环中提取的一个小例子。我怎样才能解决这个问题?

最佳答案

你有一个数据竞赛。其中一个线程写入 varint另一个是 varint没有显式同步。 varint未声明为 volatile。根据 Java 内存模型,无法保证读取线程会看到 varint被改变了。
当您添加 println 时它会起作用因为 println 在内部使用同步,这使得 varint对正在运行的线程可见。
要么使用锁定来读/写 varint ,或声明 volatile .
这是 Java 内存模型和 volatiles 的一个很好的来源:
http://tutorials.jenkov.com/java-concurrency/java-memory-model.html#visibility-of-shared-objects

关于Java:while 循环中的 For 循环不会运行,除非包含 println 语句,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63855228/

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