【Java多线程】volatile关键字

volatile作用:实现多线程之间变量共享,可以强制线程从主内存中读取数据

1.看代码:

public class RunThread extends Thread{

    private boolean isRunning=true;

    public void setRunning(boolean isRunning){
        this.isRunning=isRunning;
    }
    @Override
    public void run(){
        System.out.println("进入run了");
        while (isRunning==true){

        }
        System.out.println("线程被停止了");
    }

    public static void main(String[] args){
        try {
            RunThread thread= new RunThread();
            thread.start();
            Thread.sleep(1000);
            thread.setRunning(false);
            System.out.println("已经赋值false");
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}

运行结果:
这里写图片描述
线程不会停止,即线程进入了死循环
明明已经thread.setRunning(false);
为什么isRunning没有被判断为false呢?

原因:
私有堆栈的结构图
这里写图片描述

线程从自己的工作内存中读取数据,虽然主内存中的isRunning已经被改成了false,但是工作内存中的值并没有发生变化,所以,由于工作内存和主内存的数据不一致,程序进入了死循环。

2.用volatile解决死循环
这里写图片描述

volatile可以实现多线程之间变量共享,强制线程从主内存中读取数据
当变量用volatile修饰,线程就会从主内存中读取,就再不会出现数据不一致的问题
修改1中的代码

private boolean isRunning=true;

改成

volatile private boolean isRunning=true;

运行结果:
这里写图片描述
可看出,线程已经停止。

猜你喜欢

转载自blog.csdn.net/zjy15203167987/article/details/80478033