当条件满足时,While 循环不会终止

问题描述 投票:0回答:3

据我了解,当满足条件

stopRunning = true;
时,以下代码应该正常终止。

但是,当我运行这个程序时,它只打印

Last line of Main()
Start Method ended
永远不会打印,因为while循环永远不会终止。

 public class Test {
     private static boolean stopRunning = false;
     public static void main(String[] args) throws Exception {
        new Thread(new Runnable() {

            @Override
            public void run() {
                start();
            }

        }).start();

        Thread.sleep(100);
        stopRunning = true;
        System.out.println("Last line of Main()");
    }
    public static void start() {
        while (!stopRunning) {

        }
        System.out.println("Start Method ended.");
    }
}

请帮助我理解这种行为。

java while-loop
3个回答
1
投票

使用

 将标志更改为 
volatile

private static volatile boolean stopRunning = false;

意味着其他线程立即看到更改(从主内存而不是缓存),并且代码按您的预期执行。进一步解释了

volatile
与 Java 内存模型的关系,例如:在本教程中。


0
投票

正如 Mick 所说,您应该使用 volatile 关键字来同步您的变量,因此在更改时,新值将直接写回内存,并且您的代码将按预期工作。

请注意(Mick 链接的文章中也有说明),易失性并不能保证避免竞争条件,因此如果两个不同的线程读取您的变量,它们都读取相同的值是不安全的(尽管所有内容都是从内存中读取的)并在更改时直接写回)


0
投票

如之前的回答所述:

  1. 就像 Mike 所说的 - 在 run() 中你应该使用 Test.start() 或重命名该方法。你调用的start是线程的start方法。
  2. 正如 Mick 所说,将 stopRunning 设置为 volatile 应该会有所帮助。它应该起作用的原因是它将删除线程内存中变量的缓存并直接从内存中获取/设置。
© www.soinside.com 2019 - 2024. All rights reserved.