【发布时间】:2013-03-23 02:36:27
【问题描述】:
看看这个简单的Java程序:
import java.lang.*;
class A {
static boolean done;
public static void main(String args[]) {
done = false;
new Thread() {
public void run() {
try {
Thread.sleep(1000); // dummy work load
} catch (Exception e) {
done = true;
}
done = true;
}
}.start();
while (!done);
System.out.println("bye");
}
}
在一台机器上,它打印“再见”并立即退出,而在另一台机器上,它不打印任何东西并永远坐在那里。为什么?
【问题讨论】:
-
因为您的
boolean不是volatile,因此Threads 可以缓存它的任何副本,永远不要更新它们。我会推荐一个AtomicBoolean- 这将防止您可能遇到的任何问题。
标签: java concurrency portability memory-visibility