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

时间:2016-09-18 13:41:43

标签: 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;
   }
}

这是Main class:

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

似乎正在停止正常,但我已经读过布尔值也应该是不稳定的。为什么?会加快停止吗?

2 个答案:

答案 0 :(得分:5)

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

Java中的volatile关键字用作Java编译器和Thread的指示符,它不缓存此变量的值并始终从主内存中读取它。因此,如果您想要通过实现共享任何读取和写入操作都是原子的变量,则必须将其声明为volatile变量。

你可以在下面的图片中看到好主意 enter image description here

答案 1 :(得分:3)

具有易失性状态的

将立即在主存储器中更新。因此,只要running更新,并发线程就会立即看到更新后的状态。

更新: - 它可能在您的情况下正常工作,可能是因为您没有多个多线程的数量,或者如果您当时已经在主内存中更新了状态。观察此类行为以设置负载测试的最佳方法(使用Jmeter等工具)。这表明为什么对理论/基本概念有很好的掌握,否则你会在生产环境中遇到这些问题,因为有些项目没有预算/时间表来进行负载测试,这会引起你的不满