所以我目前正在尝试多线程,因为我对 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(使用前将#替换为@)