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

标签 java multithreading loops

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

相关文章:

java - 解决哲学家就餐问题的另一种方法(需要一个正确方向的点)

c++ - 没有 Windows API 调用的 Windows 当前 ThreadID

java - 基于 jobject 调用 java 方法失败(无效引用?)

c# - 检查 Dispatcher.CurrentDispatcher.Thread.ManagedThreadId 后的 CollectionView NotSupportedException

javascript - 简单的 Javascript 我不知道如何将函数放在 if-else 语句中

Python - 如果输入的值不正确,则重新启动 if 语句

python - 列表理解和循环之间的区别

java - 如何根据条件拆分正则表达式模式

java - Wicket:指定全局应用程序属性的模式

java - 使用 BigInteger 的 Karatsuba 乘法