我正在尝试在无限 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/