gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 02:05:12 25 4
gpt4 key购买 nike

所以我目前正在尝试多线程,因为我对 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,则它会无限循环,因为没有任何东西可以改变缓存

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

但不能保证它一定有效。要使其正常工作,请将变量声明为 volatile:

volatile long longVariable

这会阻止其值被缓存。

或者使用诸如 AtomicLong 之类的东西来代替普通的 long 变量。

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

long v;
synchronized (something) {
v = longVariable;
}
if (v < 2) ...

关于java - while 循环会在一段时间后停止执行吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51573935/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com