Java while循环在不同操作系统上的工作方式不同

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语句。

我对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语句。例如,如果我尝试
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,多年来没有更新过。这也是一个虫子缠身的怪物。