Java while循环在不同的OS上的工作方式不同

时间:2014-05-06 12:46:19

标签: java loops while-loop

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

为什么我的代码在不同的操作系统上的处理方式不同?

2 个答案:

答案 0 :(得分:2)

如果从其他线程访问非易失性变量,则行为可能是不可预测的:它可能被缓存在当前线程上。 尝试将X定义为volatile:

volatile boolean X = true;

看看:Do you ever use the volatile keyword in Java?

答案 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) {}
        }
    }        
}