当前位置: 首页 > 面试题库 >

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

袁恩
2023-03-14
问题内容

假设我有一个包含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);
    }
}

它似乎正在正确停止,但是我已经读过布尔值也应该是易变的。为什么?会加快停车速度吗?


问题答案:

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

Java中的volatile关键字用作Java编译器和Thread的指示符,它们不缓存此变量的值,而始终从主内存中读取它。因此,如果您希望共享实现中读写操作是原子性的任何变量,则必须声明为易失性变量。

您可以在下图中看到一个好主意
在此处输入图片说明



 类似资料:
  • 在我的程序中,我发现当为时,循环无法正确退出。它看起来像整数溢出,远远大于10,循环不会停止。请告诉我发生了什么,以及如何在大型项目中避免这个错误。 代码链接

  • 在我的程序中,我发现当为时,循环无法正确退出。它看起来像整数溢出,远远大于10,循环不会停止。请告诉我发生了什么,以及如何在大型项目中避免这个错误。 代码链接

  • 为什么我的parkList变量在.each函数外是空的,而我在循环外声明了它并在循环期间填充了它的值...并且循环成功执行?

  • 问题内容: 我在这里阅读Threadlocal的JavaDoc https://docs.oracle.com/javase/1.5.0/docs/api/java/lang/ThreadLocal.html 它说:“ ThreadLocal实例通常是希望将状态与线程关联的类中的私有静态字段(例如,用户ID或事务ID)。” 但是我的问题是,为什么他们选择使其静态化(通常)-使其具有“每个线程”状态

  • 问题内容: 我正在使用从队列中连续读取的线程。 就像是: 停止此线程的最佳方法是什么? 我看到两个选择: 1-由于已弃用,因此我可以实现使用原子检查条件变量的方法。 2-将死亡事件对象或类似的对象发送到队列。当线程获取死亡事件时,它退出。 我更喜欢第一种方法,但是,我不知道何时调用该方法,因为可能有某种方法进入队列,并且停止信号可能首先到达(这是不希望的)。 有什么建议? 问题答案: 该(或因为它

  • 我正在构建一个gradebook来存储学生和教师,每个学生和教师都有一个唯一的ID,以及他们各自在Student和Teacher对象的ArrayList中注册或教学的类。我有文件夹路径“j:/compsci/类/”,为每个类存储一个文本文件。 文本文件格式: 第1行:班级名称、教师ID、期间、荣誉?、班级ID 第2行:班级中每个学生的学生ID(用逗号分隔)。 在这里,我初始化了每个学生正在接受的所