volatile与可见性

可见性

    一句话归纳可见性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 能够实现可见性

 

其余实现可见性的方式

相关文章
相关标签/搜索