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);
}
}
但是 线程并么有停止,代码做如下修改
private volatile boolean isRunning=true;
分析 第一次的代码,主线程执行,当执行到
t1.start();
变量 isRunning 会 copy 一份到 子线程中,主线程 继续执行,当主线程已经修改了 isRunning 的时候,子线程 还是取的 自己内存中的 isRunning 所有不会停止,但是 加了 volatile 执行结果如下
volatile 修饰之后,子线程发现 isRunning 已经变化了,他会到主线程中 获取 volatile 中获取,这样isRunning 就能通知到 子线程
volatile 不具备原子性,只是线程之间可见性