我在第66项中读到了名为 Effective Java 2 的书,它说后台线程将永远运行并永不停止。但是,当我在计算机中运行代码时,它会在一秒钟内停止运行?怎么了?它是计算机缓存问题吗?
public class StopThread {
private static boolean stopRequested;
public static void main(String[] args)
throws InterruptedException {
Thread backgroundThread = new Thread(new Runnable() {
public void run() {
int i = 0;
while (!stopRequested) {
i++;
System.out.println(i+";");
}
}
});
backgroundThread.start();
TimeUnit.SECONDS.sleep(1);
stopRequested = true;
}
}
这些书建议使用Synchronize
或volatile
,但我尝试发现即使我不使用该建议,它也会在我的计算机中运行一秒钟。但是永远在我的室友身边跑。他说这是缓存配置的原因。
谁能告诉我原因?
答案 0 :(得分:4)
有效Java的作者Bloch所说的是" 在没有同步的情况下,无法保证何时,如果有的话,后台线程会看到值中的变化停止 - 请求 [SIC]"。
也就是说,它可能会立即停止。或者它可能在短时间后停止。或者它永远不会停止。 必需永远不会运行。就此而言,甚至不需要编译器来移除同步。但它可以。而且很可能。所以你就是那里" volatile"关键字来了。
答案 1 :(得分:0)
您在原始示例中添加了一行:
System.out.println(i+";");
PrintStream.println(String)
包含synchronized
块,其对volatile
具有类似的内存一致性效果。