深入理解volatile原理与使用

原创 2018年04月16日 19:10:12

深入理解volatile原理与使用

Volatile称之为轻量级锁,被volatile修饰的变量,在线程之间是可见的,保证不了非原子性操作,它比synchronized的使用和执行成本更低,因为它不会引起线程上下文的切换和调度。

有volatile变量修饰的共享变量在进行写操作的时候汇编代码中会出现Lock指令

Lock指令在多核处理器下会引发两件事情:

  • 将当前处理器缓存行的内容写回到系统内存
  • 写回到内存的操作会使在其他CPU里缓存了该内存地址的数据失效,Intel64处理器使用MESI(修改,独占,共享,无效)控制协议去维护内部缓存和其他处理器缓存的一致性。

为了提高处理速度,处理器不直接与内存进行通行,而是将系统内存的数据独到内部缓存(L1,L2或其它)后再进行操作。如果对申明了volatile的变量进行写操作,JVM就会向处理器发送一条Lock前缀的指令,将这个变量所在缓存行的数据写回到系统内存中。在多处理器下,为了保证各个处理器中的缓存是一致的,就会实现缓存一致性协议,每个处理器通过嗅探在总线上传播的数据来检查自己缓存的值是不是过期了,当处理器发现自己缓存行对应的内存地址被修改,就会将当前处理器缓存行设置为无效状态,当处理器对这个数据进行修改操作的时候,会重新从系统内存中把数据读到处理器缓存中。

下面的代码给出了一个volatile变量常用的场景,在代码中,设置run变量为volatile,在第一个线程执行完毕后,将run设置为true,而在第二个线程中,首先不停地自旋操作,判断run变量是否为true,然后在进行线程任务。

public class Demo2 {
	
	public volatile boolean run = false;
	
	public static void main(String[] args) {
		
		Demo2 d = new Demo2();
		
		new Thread(new Runnable() {
			
			@Override
			public void run() {
				for(int i = 1;i<=10;i++) {
					System.err.println("执行了第 " + i + " 次");
					try {
						Thread.sleep(1000);
					} catch (InterruptedException e) {
						e.printStackTrace();
					}
				}
				d.run = true;
			}
		}).start();
		
		new Thread(new Runnable() {
			
			@Override
			public void run() {
				while(!d.run) {
					// 不执行
				}
				System.err.println("线程2执行了...");
			}
		}).start();		
	}
}

浅谈volatile关键字

今天学习CurrentHashMap源码,发现CurrentHashMap源码中有的属性是用volatile修饰的,别人说volatile可以保证读写的内容是最新的。看到这句话的时候还是满脑子的问号。...
  • wangbiao007
  • wangbiao007
  • 2016-10-09 12:05:28
  • 720

深入理解Java虚拟机笔记---volatile变量的特殊规则

当一个变量定义成volatile之后,它将具备两种特性:第一是保证此变量对所有线程的可见性,这里的“可见性”是指当一条线程修改了这个变量的值,新值对于其它线程是可以立即得知的,变量值在线程间传递均需要...
  • xtayfjpk
  • xtayfjpk
  • 2014-12-15 20:58:35
  • 1330

读书笔记——深入理解虚拟机

自动内存管理机制 Java与C++之间有一堵由内存分配和垃圾收集所围成的“高强”,墙外面的人想进去,强里面的人却想出来。 java内存区域与内存溢出异常 每个线程私有 程序计数器:可以看做是当前...
  • qq_24145735
  • qq_24145735
  • 2016-08-05 23:34:53
  • 611

你真的了解volatile吗,关于volatile的那些事

很早就接触了volatile,但是并没有特别深入的去研究她,只有一个朦胧的概念,就是觉得 用她来解决可见性的,但可见性又是什么呢? 最近经过查阅各种资料,并结合自己的思考和实践,对vola...
  • u013761206
  • u013761206
  • 2017-03-14 09:06:09
  • 767

深入理解OSGi Equinox原理、应用与最佳实践 PDF 完整版.pdf

  • 2016年07月05日 20:00
  • 29.18MB
  • 下载

volatile与synchronized 同步原理基础讲解

基本知识: 可见性:   可见性是一种复杂的属性,因为可见性中的错误总是会违背我们的直觉。通常,我们无法确保执行读操作的线程能适时地看到其他线程写入的值,有时甚至是根本不可能的事情。为了确保多个线...
  • lxlmycsdnfree
  • lxlmycsdnfree
  • 2017-04-20 11:14:11
  • 360

深入理解内存(1):原理简介

发现编程的很多问题最后整来整去,最后又是归结到内存上面来了.所以决定好好来研究下内存.   我们知道冯.诺伊曼体系结构中是把计算机划分为输入设备,输出设备,存储器,控制器,运算器. 输入设备主...
  • weiwenhp
  • weiwenhp
  • 2013-01-15 15:03:06
  • 1568

全面理解Java内存模型(JMM)及volatile关键字

【版权申明】未经博主同意,谢绝转载!(请尊重原创,博主保留追究权) http://blog.csdn.net/javazejian/article/details/72772461 ...
  • javazejian
  • javazejian
  • 2017-06-12 11:25:05
  • 19037

深入理解kafka设计原理

最近开研究kafka,下面分享一下kafka的设计原理。kafka的设计初衷是希望作为一个统一的信息收集平台,能够实时的收集反馈信息,并需要能够支撑较大的数据量,且具备良好的容错能力.     ...
  • q412774506
  • q412774506
  • 2015-07-22 15:36:53
  • 499

深入理解windows内部原理系列--笔记二

CR3寄存器:用来记录页目录表的物理基地址的寄存器,简称PDBR(page directory base register)   切换CR3寄存器意味着切换地址空间   不同进程拥有不同的地址...
  • yalecaltech
  • yalecaltech
  • 2017-04-28 22:34:34
  • 487
收藏助手
不良信息举报
您举报文章:深入理解volatile原理与使用
举报原因:
原因补充:

(最多只允许输入30个字)