java - 为什么我的 boolean 变量在停止线程循环时应该是易变的?

标签 java multithreading volatile

<分区>

假设我有一个包含 while 循环的线程,我想“从外部”停止它。

public class MyThread extends Thread {

    private boolean running = true;

    @Override
    public void run() {
        while (running) {
            // do something
        }
    }

    public void setRunning(boolean running) {
        this.running = running;
   }
}

这是主类:

public class Main {
    public static void main(String[] args) {
        MyThread mt = new MyThread();
        mt.start();
        // do something
        mt.setRunning(false);
    }
}

它似乎停止正常,但我读到 boolean 值也应该是易变的。为什么?它会加速停止吗?

最佳答案

当并发线程将缓存运行变量时,这意味着它将缓存在线程工作内存中。

Java 中的 volatile 关键字用作 Java 编译器和 Thread 的指示符,它们不会缓存此变量的值并始终从主内存中读取它。所以如果你想共享任何变量,其中读写操作是原子的,你必须声明为 volatile 变量。

看看下面的图片你就会有好主意 enter image description here

关于java - 为什么我的 boolean 变量在停止线程循环时应该是易变的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39558261/

相关文章:

x86 架构上的 Java、volatile 和内存屏障

java - 我怎样才能用数组替换我代码中的 ArrayList 并且它仍然有效?

c++ - 线程,如何独立播种随机数生成器?

Java 数组 : synchronized + Atomic*, 或同步就足够了吗?

java - volatile 示例(在 JLS8/8.3.1.4 volatile 字段中)不起作用?

java - 在 Java 中,当对象中的一个方法是 'synchronized' 时,所有方法都是 'synchronized' 吗?

java - Tomcat - 数据库连接池问题

java - 使用maven找不到jena.db包

java - Eclipse - 构建后从触发工作区刷新中排除文件/文件夹

python - Django后台无限循环进程管理