我在 HotSpot 和 Android ART 上测试了以下代码,但结果不同。
在 HotSpot 上,MyThread
永远不会得到更新isRunning
,它isRunning
总是得到 = true ......但是当我在 ART 上测试它时,MyThread
可以正常获取更新isRunning
并退出循环......
据我所知,java 发生前规则,非易失性在多线程中不可见,就像下面代码在 Hotspot 上的行为一样。
它是否取决于VM实现?或者也许 Android ART 有自己的优化?
class MyThread extends Thread {
public boolean isRunning = true;
@Override
public void run() {
System.out.println("MyThread running");
while (true) {
if (isRunning == false) break;
}
System.out.println("MyThread exit");
}
}
public class RunThread{
public static void main(String[] args) {
new RunThread().runMain();
}
public void runMain() {
MyThread thread = new MyThread();
try {
thread.start();
Thread.sleep(500);
thread.isRunning = false;
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}