小编pet*_*ulb的帖子

当核心缓存同步是在硬件层面上完成的,为什么我们需要 volatile 关键字?

所以我目前正在参加这个演讲。在 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)

java concurrency

2
推荐指数
1
解决办法
118
查看次数

标签 统计

concurrency ×1

java ×1