我现在正在阅读“有效Java”并遇到混淆。项目66:同步对共享可变数据的访问
对于代码1(java8):
public class StopThreadTest {
private static Boolean stopRequest = false;
public static void main(String[] args) throws InterruptedException {
new Thread(()->{
int i = 0;
while (!stopRequest) {
i++;
//System.out.println("i: " + i);
}
}).start();
TimeUnit.SECONDS.sleep(1);
stopRequest = true;
}
}
程序永远不会终止。
对于代码2(java8):
public class StopThreadTest {
private static Boolean stopRequest = false;
public static void main(String[] args) throws InterruptedException {
new Thread(()->{
int i = 0;
while (!stopRequest) {
i++;
System.out.println("i: " + i);
}
}).start();
TimeUnit.SECONDS.sleep(1);
stopRequest = true;
}
}
只是增加System.out.println()
,该程序运行约1秒。
有人可以告诉我为什么吗?
这是有效的Java的官方例子吗?如果是这样:哪个版本? – Turing85
@ Turing85当然不在我的书中。实际上,这本书与这个例子相矛盾,说读写'stopRequest'必须同步。不仅仅是一些随机的方法,它的内部实现恰好是同步的。 –
在第二版中,作者使用代码1来解决必须同步读取和写入stopRequest的问题。我只是添加一个System.out.println来调试它,就像代码2一样。 – Dustin