欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

【Java多线程】volatile关键字

程序员文章站 2022-05-05 16:35:02
...

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();
        }
    }
}

运行结果:
【Java多线程】volatile关键字
线程不会停止,即线程进入了死循环
明明已经thread.setRunning(false);
为什么isRunning没有被判断为false呢?

原因:
私有堆栈的结构图
【Java多线程】volatile关键字

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

2.用volatile解决死循环
【Java多线程】volatile关键字

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

private boolean isRunning=true;

改成

volatile private boolean isRunning=true;

运行结果:
【Java多线程】volatile关键字
可看出,线程已经停止。