读一本书,出现以下代码:
public class Test {
private static boolean ready = false;
private static int number = 0;
public static class ListenerThread extends Thread {
public void run() {
while(!ready) {
Thread.yield();
}
System.out.println(number);
}
}
public static void main (String[] args) {
new ListenerThread().start();
number = 10;
ready = true;
}
}
让我吃惊的要点,作者提的比较快。
他们说 ListenerThread 可能永远不会终止。我考虑了几天(在我的脑后),我唯一的结论是它可能被那个 ListenerThread 缓存了。真的吗?制作
ready
volatile 会解决问题吗(因为它不应该再缓存它了)?他们还说程序可能会打印 0。我现在明白 Java 可能会重新排序指令,因此在更改数字之前准备好对另一个线程是正确的。除了将这些指令放在同步块中解决问题(在中央锁值上)之外,还有什么方法(技术)?我在想也许可以实现 notify()/wait(),但我觉得它会遭受同样的后果。避免该问题的最佳方法是什么?
谢谢!
编辑:
我只是觉得我已经阅读了很多代码,很少有人会费心防止在多个线程中重新排序。这有多普遍?