多线程之volatile的使用

在java中,每一个线程都一个独立的工作内存,各个线程的工作内存之间相互独立、互不可见,工作内存中的变量的数据值都是事先从主内存中拷贝的,当线程执行时候,就会在工作内存中操作这些变量的值,最后当线程执行完毕,就会将这些变量的值推送给主内存。
对于volatile修饰的变量而言, 只要在任何工作内存中发生改变就会被强制刷新到主内存中去,然后其他线程的工作内存重新在主内存中获取该变量的值。

这里写图片描述

首先看下面的案例:

package com.wuk.diryRead;

public class MyThread001 extends Thread{

    private boolean  isRunning=true;
    private void setRunning(boolean  isRunning) {

        this.isRunning=isRunning;
    }

    @Override
    public void run() {

        System.out.println("进入run方法。。。。");
        while(isRunning) {      

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

    public static void main(String[] args) {

        MyThread001 t1=new MyThread001();
        t1.start();
        try {
            Thread.sleep(3000);
            t1.setRunning(false);
            System.out.println("主线程已经将isRunning设置成false了");
            Thread.sleep(1000);
            System.out.println(t1.isRunning);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }


    }
}

运行结果

进入run方法。。。。
主线程已经将isRunning设置成falsefalse

当main方法已经将判断条件isRunning变量的值变成了false,但是在t1线程的工作内存中isRunning的值还是true,所以线程肯定还会一直执行下去。

当我将变量写成如下:

private volatile boolean  isRunning=true;

运行结果如下:

进入run方法。。。。
主线程已经将isRunning设置成false了
线程停止
false`

猜你喜欢

转载自blog.csdn.net/wu2374633583/article/details/80616853