while 循环会在一段时间后停止执行吗?

所以我目前正在尝试使用多线程,因为我对 Java 仍然很陌生。现在,我有多个线程都影响同一个 long 变量。但是,似乎在一段时间后除了检查 if 语句之外什么都不做,while 循环才停止执行(例如,它无限循环)。如果我只是在 while 循环中打印一些东西,它确实有效。


不起作用:


while(true){

  if(longVariable < 2)

    break;

}

以某种方式工作:


while(true){

  System.out.println("hi");

  if(longVariable < 2)

    break;

}

为什么是这样?


ABOUTYOU
浏览 213回答 2
2回答

富国沪深

当您有一个未被线程更新的非易失性变量时,可以自由地内联它。在第一种情况下,一旦 JIT 编译了代码,它可能不再读取值,而是使条件始终为真。在第二种情况下,您有一个线程安全操作。printlnonSystem.out是一种synchronized方法。这增加了读写屏障并防止 JIT 优化读取操作。如果你尝试这个,它也应该有效。while(true){&nbsp; synchronized("hi") { } // does nothing but add memory barriers.&nbsp; if(longVariable < 2)&nbsp; &nbsp; break;}它还会使代码减慢 1000 倍以上,因此在您尝试停止线程时该方法可能尚未 JIT。简单的解决方案是使变量volatile每次都以线程安全的方式读取。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java