据我了解,以下代码应在满足stopRunning = true;
的条件下正常终止。
但是,当我运行该程序时,它仅打印Last line of Main()
,而while循环从未终止,因此从未打印过Start Method ended
。
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.");
}
}
请帮助我了解这种行为。
答案 0 :(得分:1)
使用
将标志更改为volatile
private static volatile boolean stopRunning = false;
表示其他线程(从主内存而不是从缓存中)立即看到更改 ,并且代码按预期执行。 volatile
如何与Java的内存模型相关联,例如,在this tutorial中。
答案 1 :(得分:0)
如Mick所述,您应该使用volatile关键字来同步变量,以便在更改时将新值直接写回到内存中,并且代码将按预期工作。
请注意(在Mick链接的文章中也有提及),volatile不能保证避免出现竞争情况,因此,如果两个不同的线程将读取您的变量,则它们都读取相同的值(尽管读取了所有内容)是不安全的从内存中读取并直接写回更改)
答案 2 :(得分:0)
如先前的回答所述: