为什么我将运行标志设置为 false 后线程继续运行



当标志为真时,我有一个线程正在运行,但是当我将标志更改为假时,它不会死。

public static void main(String[] args)
    {
        try
        {
            MyThread mt = new MyThread();
            mt.start();
            Thread.sleep(1000);
            mt.setRunning(false);
            System.out.println("set running false");
        }
        catch (InterruptedException e)
        {
            e.printStackTrace();
        }
    }
    public static class MyThread extends Thread
    {
        private boolean isRunning = true;
        public boolean isRunning()
        {
            return isRunning;
        }
        public void setRunning(boolean isRunning)
        {
            this.isRunning = isRunning;
        }
        public void run()
        {
            System.out.println("run");
            while (isRunning == true){
            }
            System.out.println("run over!");
        }
    }

我知道将"isRunning"定义为易失性可以解决问题,但是当不是易失性时,"isRunning"应该在MyThread的某个时候不可见?

这是

由于可见性原因。

使您的变量易失性:

volatile private boolean isRunning = true;

有关更多详细信息,请参阅易失性关键字的用途。

我知道将"isRunning"定义为易失性可以解决问题,但是 当不易失时,"isRunning"在某个时候应该不可见 我的线程?

这是isRunning的值更改,您需要在main线程更改时MyThread可见。否则,它可能只是继续看到true的缓存值。

这里有两个线程。每个线程都有一个缓存。如果不添加 volatile ,线程将从所有者缓存中读取值。所以,myThread.isRunning是真的。通过使用volatile,所有者线程可以强制写入内存并刷新缓存。

相关内容

最新更新