Java while循环在不同操作系统上的工作方式不同
我对Debian下的java有一个非常奇怪的问题。在windows上,此操作有效:Java while循环在不同操作系统上的工作方式不同,java,loops,while-loop,Java,Loops,While Loop,我对Debian下的java有一个非常奇怪的问题。在windows上,此操作有效: boolean X=true; while(X); 当X为true时,此代码执行循环,当我将X设置为false时,循环结束。 问题是,在Debian上,当我将X设置为false时,while循环不会停止 如果我修改代码: boolean X=true; while(X) { System.out.println("hello"); } 这段代码在Debian上运行良好,但前提是我添加了print语句。
boolean X=true;
while(X);
当X
为true时,此代码执行循环,当我将X
设置为false时,循环结束。
问题是,在Debian上,当我将X
设置为false时,while循环不会停止
如果我修改代码:
boolean X=true;
while(X) {
System.out.println("hello");
}
这段代码在Debian上运行良好,但前提是我添加了print语句。例如,如果我尝试I++
,它就不能正常工作,只有在使用print语句时才能正常工作
为什么我的代码在不同的操作系统上处理方式不同?如果从其他线程访问非易失性变量,则行为可能不可预测:它可能缓存在当前线程上。 尝试将
X
定义为易失性:
volatile boolean X = true;
请看:我发现这会根据处理器的体系结构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) {}
}
}
}
当你将X设置为false时,你能发布你正在使用的完整代码吗?发布不起作用的实际代码。我正在尝试我的心灵感应技能。我认为您的程序至少有两个线程(一个是while循环旋转的线程,另一个是将标志X设置为false的线程)。如果一个变量是从多个线程读取/写入的,则需要努力使一个线程中所做的更改在其他线程中可见。如果你让你的X变得易变或者用AtomicBoolean替换它,它应该可以做到这一点。与Debian无关。涉及的Java版本是什么?上次我检查linux上的默认“Java”是gcj,它不是Java,多年来没有更新过。这也是一个虫子缠身的怪物。