所以我目前正在参加这个演讲。在 28:50 分钟,做出以下声明:“在硬件上,它可能位于主内存中、多个三级缓存中、四个二级缓存中 [...] 这不是你的问题。这就是硬件设计人员的问题。”
然而,在 Java 中,我们必须将停止线程的布尔值声明为 volatile,因为当另一个线程调用 stop 方法时,不能保证正在运行的线程会知道此更改。
为什么会出现这种情况,硬件级别应该负责用正确的值更新每个缓存?
我确定我在这里遗漏了一些东西。
有问题的代码:
public class App {
public static void main(String[] args) {
Worker worker = new Worker();
worker.start();
try {
Thread.sleep(10);
} catch (InterruptedException e) {
e.printStackTrace();
}
worker.signalStop();
System.out.println(worker.isShouldStop());
System.out.println(worker.getVal());
System.out.println(worker.getVal());
}
static class Worker extends Thread {
private /*volatile*/ boolean shouldStop = false;
private long val = 0;
@Override
public void run() {
while (!shouldStop) {
val++;
}
System.out.println("Stopped");
}
public void signalStop() { …Run Code Online (Sandbox Code Playgroud)