文档章节

volatile与可见性

w
 wall--e
发布于 2016/05/08 22:45
字数 521
阅读 164
收藏 3

可见性

    一句话概括可见性

    一个线程修改了共享变量, 其他线程可以立即知道

 

下面通过2段代码, 看一看 volatile 的作用:

1. 未经 volatile 修饰的共享变量 stop

/**
 * @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();
	}
}

 

运行这段代码时, 可以发现:

无输出

这说明子线程 subThread 的 run() 方法一直处于死循环中, stop 值为 false, 但是明明在主线程修改了 stop 为 true 啊

这是因为在主线程只是在其工作内存修改了共享变量的副本, 而主内存的共享变量没有被及时更新, 所以其他线程观察不到这个修改动作

 

2. 用 volatile 修饰共享变量 stop

/**
 * @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();
	}
}

 

运行这段代码时, 可以发现:

    输出: 子程序 stoped

这说明主线程在修改共享变量后, 子线程在工作内存中更新了共享变量的最新值

由此可见, volatile 可以实现可见性

 

其他实现可见性的方式

© 著作权归作者所有

共有 人打赏支持
w
粉丝 7
博文 31
码字总数 25016
作品 0
东城
程序员
私信 提问
Java多线程之内存可见性

Java内存模型( JMM ) : 1) 所有的变量都存储在主内存中 2) 每个线程都有自己独立的工作内存, 里面保存该线程使用到的变量的副本 ( 主内存中该变量的一份拷贝 ) JMM 两条规定: 1) 线程对共享变...

wall--e
2016/05/07
174
1
volatile关键字解析~高级java必问

昨天我介绍了原子性、可见性、有序性的概念,那么今天就来见识下这些概念的主角-volatile关键字。 volatile基本介绍 volatile可以看成是synchronized的一种轻量级的实现,但volatile并不能完...

java技术栈
2017/08/13
0
0
多线程学习笔记(十二)

volatile的作用是使变量在多个线程间可见 1.死循环 public class PrintInfo implements Runnable { } public class Run { PrintInfo printInfo = new PrintInfo();printInfo.printInfo();Sy......

scymore
2016/09/13
43
0
并发和多线程-说说面试常考平时少用的volatile

说到volatile,一些参加过面试的同学对此肯定不陌生。 它是面试官口中的常客,但是平时的编码却很少打照面(起码,我是这样的)。 最近的面试,我也经常会问到volatile相关的问题,比如volat...

Jackie_Zheng
2018/06/02
0
0
Java并发编程笔记2-线程可见性&线程封闭&指令重排序

一.指令重排序 例子如下: public class Visibility1 { } public class ReaderThread extends Thread { } public class Test1 { } 多次运行结果分别如下: 可以看到多次运行所得到三种结果,...

狂小白
2018/03/05
0
0

没有更多内容

加载失败,请刷新页面

加载更多

大数据教程(11.9)hive操作基础知识

上一篇博客分享了hive的简介和初体验,本节博主将继续分享一些hive的操作的基础知识。 DDL操作 (1)创建表 #建表语法CREATE [EXTERNAL] TABLE [IF NOT EXISTS] table_name [(col_name ...

em_aaron
今天
0
0
OSChina 周四乱弹 —— 我家猫真会后空翻

Osc乱弹歌单(2019)请戳(这里) 【今日歌曲】 @我没有抓狂 :#今天听这个# 我艇牛逼,百听不厌,太好听辣 分享 Led Zeppelin 的歌曲《Stairway To Heaven》 《Stairway To Heaven》- Led Z...

小小编辑
今天
2
0
node调用dll

先安装python2.7 安装node-gyp cnpm install node-gyp -g 新建一个Electron-vue项目(案例用Electron-vue) vue init simulatedgreg/electron-vue my-project 安装electron-rebuild cnpm ins......

Chason-洪
今天
3
0
scala学习(一)

学习Spark之前需要学习Scala。 参考学习的书籍:快学Scala

柠檬果过
今天
3
0
通俗易懂解释网络工程中的技术,如STP,HSRP等

导读 在面试时,比如被问到HSRP的主备切换时间时多久,STP几个状态的停留时间,自己知道有这些东西,但在工作中不会经常用到,就老是记不住,觉得可能还是自己基础不够牢固,知识掌握不够全面...

问题终结者
昨天
4
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部