我在Debian下的java有一个非常奇怪的问题。在Windows上,这有效:
boolean X=true;
while(X);
当X
为真时,此代码执行循环,当我将X
设置为false时,while循环结束。
问题是在Debian上使用SAME代码,当我将X
设置为false时,while循环不会停止。
如果我修改代码:
boolean X=true;
while(X) {
System.out.println("hello");
}
这段代码在Debian上运行正常但只有在我添加print语句时才能正常工作。如果我尝试i++
例如它无法正常工作,只能使用print语句。
为什么我的代码在不同的操作系统上的处理方式不同?
答案 0 :(得分:2)
如果从其他线程访问非易失性变量,则行为可能是不可预测的:它可能被缓存在当前线程上。
尝试将X
定义为volatile:
volatile boolean X = true;
答案 1 :(得分:0)
我发现这会给出有趣的结果,具体取决于处理器架构x86与64位。
public class WhileTrueTest
{
boolean keepGoing = true;
volatile boolean volatileKeepGoing = true;
public static void main( String[] args ) throws InterruptedException
{
new WhileTrueTest().go();
}
private void go() throws InterruptedException
{
final Thread tNormal = new InnerNormal();
final Thread tVolatile = new InnerVolatile();
tNormal.start();
tVolatile.start();
Thread.sleep( 1000 );
keepGoing = false;
volatileKeepGoing = false;
Thread.sleep( 1000 );
System.out.printf("Threads shouldn't be alive. Are they? Normal:%s Volatile:%s",
tNormal.isAlive(),
tVolatile.isAlive());
System.out.println();
System.exit(1);
}
class InnerNormal extends Thread
{
@Override
public void run()
{
while(keepGoing) {}
}
}
class InnerVolatile extends Thread
{
@Override
public void run()
{
while(volatileKeepGoing) {}
}
}
}