为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

ABOUTYOU 2021-06-08 17:31:55
所以我目前正在尝试使用多线程,因为我对 Java 仍然很陌生。现在,我有多个线程都影响同一个 long 变量。但是,似乎在一段时间后除了检查 if 语句之外什么都不做,while 循环才停止执行(例如,它无限循环)。如果我只是在 while 循环中打印一些东西,它确实有效。不起作用:while(true){  if(longVariable < 2)    break;}以某种方式工作:while(true){  System.out.println("hi");  if(longVariable < 2)    break;}为什么是这样?
查看完整描述

2 回答

?
富国沪深

TA贡献1790条经验 获得超9个赞

当您有一个未被线程更新的非易失性变量时,可以自由地内联它。


在第一种情况下,一旦 JIT 编译了代码,它可能不再读取值,而是使条件始终为真。


在第二种情况下,您有一个线程安全操作。printlnonSystem.out是一种synchronized方法。这增加了读写屏障并防止 JIT 优化读取操作。


如果你尝试这个,它也应该有效。


while(true){

  synchronized("hi") { } // does nothing but add memory barriers.

  if(longVariable < 2)

    break;

}

它还会使代码减慢 1000 倍以上,因此在您尝试停止线程时该方法可能尚未 JIT。


简单的解决方案是使变量volatile每次都以线程安全的方式读取。


查看完整回答
反对 回复 2021-06-17
  • 2 回答
  • 0 关注
  • 212 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信