java 并发编程【一个demo 学习--volatile(五)】

demo 如下

package com.study.thread;

public class VolatileTest extends Thread{

    private boolean flag=true;

    public void setFlag(boolean flag){
        this.flag=flag;
    }

    @Override
    public void run(){
        System.out.println("run is begin");
        while (this.flag){

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

    public static void main(String[] args) {
        VolatileTest t1 = new VolatileTest();
        t1.start();
        try {
            Thread.sleep(3000);
            t1.setFlag(false);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println("flag  " + t1.flag);
    }
}

java 并发编程【一个demo 学习--volatile(五)】

但是 线程并么有停止,代码做如下修改

private volatile boolean isRunning=true;

java 并发编程【一个demo 学习--volatile(五)】

分析 第一次的代码,主线程执行,当执行到 

t1.start();

变量 isRunning 会 copy 一份到  子线程中,主线程 继续执行,当主线程已经修改了 isRunning 的时候,子线程 还是取的 自己内存中的 isRunning 所有不会停止,但是 加了 volatile 执行结果如下

java 并发编程【一个demo 学习--volatile(五)】

 

volatile  修饰之后,子线程发现 isRunning 已经变化了,他会到主线程中 获取 volatile 中获取,这样isRunning 就能通知到 子线程

volatile   不具备原子性,只是线程之间可见性