Dog*_*Dog 3 java concurrency portability memory-visibility
看看这个简单的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");
}
}
Run Code Online (Sandbox Code Playgroud)
在一台机器上,它打印"再见"并立即退出,而在另一台机器上,它不打印任何东西并永远坐在那里.为什么?
这是因为你boolean不是volatile,因此Thread允许s缓存它的副本并且永远不会更新它们.我会建议AtomicBoolean- 这将防止您可能遇到的任何问题.
public static void main(String args[]) {
final AtomicBoolean done = new AtomicBoolean(false);
new Thread() {
public void run() {
done.set(true);
}
}.start();
while (!done.get());
System.out.println("bye");
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
496 次 |
| 最近记录: |