据我了解,当满足条件
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.");
}
}
请帮助我理解这种行为。
使用
将标志更改为
volatile
private static volatile boolean stopRunning = false;
意味着其他线程立即看到更改(从主内存而不是缓存),并且代码按您的预期执行。进一步解释了
volatile
与 Java 内存模型的关系,例如:在本教程中。
正如 Mick 所说,您应该使用 volatile 关键字来同步您的变量,因此在更改时,新值将直接写回内存,并且您的代码将按预期工作。
请注意(Mick 链接的文章中也有说明),易失性并不能保证避免竞争条件,因此如果两个不同的线程读取您的变量,它们都读取相同的值是不安全的(尽管所有内容都是从内存中读取的)并在更改时直接写回)
如之前的回答所述: