在Linux中运行时,Java不会破坏一段时间

dgn*_*nin 6 java linux while-loop

我发现了一个用于家庭作业的Java代码的神秘问题.一个朋友在开始时编写一个应用程序:

public void run() {
    vm.setVisible(true);
    while(!end);
    System.out.println("Finish");
    vm.setVisible(false);
}
Run Code Online (Sandbox Code Playgroud)

在所有执行时以及当用户退出应用程序时,布尔'end'为false,这种情况发生:

private class CloseSys implements ActionListener {
    public CloseSys() {super();}

        public void actionPerformed(ActionEvent e) {
        System.out.println("CLOSE SYS");
        System.out.println("end: "+end);
        end = true;
        System.out.println("end: "+end);
    }
}
Run Code Online (Sandbox Code Playgroud)

println显示像'end'的值更改为true和逻辑上在我朋友的计算机(MacOS)中完成和应用程序也是如此.

问题是在我的计算机(Ubuntu Linux)中,println也显示了值的变化,但是while没有结束(永远不会达到"Finish"println).有趣的是,如果我们把印刷品放到一边......然后才有效!

Pau*_*lin 5

其他几个人提到它应该是不稳定的.似乎没有人提到的一件事是你"忙着等待",这是错误的,错误的,错误的错误.如果您想等待另一个线程中发生的事情,您应该使用同步锁或信号量.


dac*_*cwe 3

end一定是volatile因为它在两个线程之间共享!