设为首页 加入收藏

TOP

【Java多线程】volatile关键字
2019-05-14 12:19:42 】 浏览:11
Tags:Java 线程 volatile 关键字
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/zjy15203167987/article/details/80478033

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;

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


编程开发网
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇【MySQL】-索引 下一篇matlab连接mysql数据库

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容:

array(4) { ["type"]=> int(8) ["message"]=> string(24) "Undefined variable: jobs" ["file"]=> string(32) "/mnt/wp/cppentry/do/bencandy.php" ["line"]=> int(214) }