所以我目前正在尝试使用多线程,因为我对 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每次都以线程安全的方式读取。
添加回答
举报
0/150
提交
取消