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

2024-01-04

所以我目前正在尝试多线程,因为我对 Java 还很陌生。现在,我有多个线程,它们都影响同一个长变量。然而,似乎在除了检查 if 语句之外不做任何事情之后, while 循环就停止执行(如,它无限循环)。如果我只是在 while 循环中打印一些东西,它确实有效。

不起作用:

while(true){
  if(longVariable < 2)
    break;
}

确实有效:

while(true){
  System.out.println("hi");
  if(longVariable < 2)
    break;
}

为什么是这样?


while(true){
  if(longVariable < 2)
    break;
}

在这段代码中,JVM 没有理由相信longVariable将会永远改变。它可以有效地将其重写为:

long cached = longVariable;
while(true){
  if(cached < 2)
    break;
}

无限循环如果longVariable执行时至少为 2,因为没有任何改变cached.

您必须向编译器提示不允许进行此重写。它与System.out.println在您的 JVM 上,因为它恰好是通过同步实现的(这很常见,但不是必需的)。这会插入内存屏障,这意味着缓存的值longVariable已失效,需重新读取。

但它不能保证有效。为了使其正常工作,可以将变量声明为 volatile:

volatile long longVariable

这会阻止其值被缓存。

或者使用类似的东西AtomicLong而不是一个普通的long多变的。

或者,最繁琐的是,使用显式同步(确保对变量的所有读取和写入都在同一“事物”上同步):

long v;
synchronized (something) {
  v = longVariable;
}
if (v < 2) ...
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

while 循环会在一段时间后停止执行吗? [复制] 的相关文章

随机推荐