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