一句话归纳可见性ide
一个线程修改了共享变量, 其余线程能够当即知道this
下面经过2段代码, 看一看 volatile 的做用:spa
1. 未经 volatile 修饰的共享变量 stop.net
/** * @author 宋挺 */ public class VolatileDemo1 implements Runnable { // 共享变量 private boolean stop = false; // 修改共享变量 public void stop() { this.stop = true; } // 线程体 @Override public void run() { while (!stop) { } System.out.println("子程序 stoped"); } public static void main(String[] args) throws InterruptedException { VolatileDemo1 vd = new VolatileDemo1(); // 新建态 Thread subThread = new Thread(vd); // 就绪态 subThread.start(); // 在主线程调用 stop() 方法以前, 保证子线程先启动, 进入运行状态 Thread.sleep(10); // 主线程调用 stop() 方法, 将共享变量 stop 修改成 true vd.setStop(); } }
运行这段代码时, 能够发现:线程
无输出code
这说明子线程 subThread 的 run() 方法一直处于死循环中, stop 值为 false, 可是明明在主线程修改了 stop 为 true 啊blog
这是由于在主线程只是在其工做内存修改了共享变量的副本, 而主内存的共享变量没有被及时更新, 因此其余线程观察不到这个修改动做内存
2. 用 volatile 修饰共享变量 stopget
/** * @author 宋挺 */ public class VolatileDemo1 implements Runnable { // 用 volatile 修饰共享变量 private volatile boolean stop = false; // 修改共享变量 public void stop() { this.stop = true; } // 线程体 @Override public void run() { while (!stop) { } System.out.println("子程序 stoped"); } public static void main(String[] args) throws InterruptedException { VolatileDemo1 vd = new VolatileDemo1(); // 新建态 Thread subThread = new Thread(vd); // 就绪态 subThread.start(); // 在主线程调用 stop() 方法以前, 保证子线程先启动, 进入运行状态 Thread.sleep(10); // 主线程调用 stop() 方法, 将共享变量 stop 修改成 true vd.setStop(); } }
运行这段代码时, 能够发现:io
输出: 子程序 stoped
这说明主线程在修改共享变量后, 子线程在工做内存中更新了共享变量的最新值
因而可知, volatile 能够实现可见性