java并发编程学习(二) volatile
来源:互联网 发布:熊猫杀姐姐知乎 编辑:程序博客网 时间:2024/06/05 03:13
在多线程并发中,synchronize和volatile都扮演重要角色,volatile是轻量级的synchronized,在多线程开发中保证了共享变量的可见性。可见性指的是当一个线程修改一个共享变量时候,另一个线程能读到这个修改的值。
如果volatile变量修饰符使用得当的话,它比synchronized的使用和执行成本更低,因为他不会引起线程的上下文切换和调度,如果一个变量声明为volatile的,java线程内存模型确保所有线程看到这个变量的值是一致的。
1. volatile的定义和实现原理
先了解下实现原理相关的cpu术语和说明
volatile是如何保证可见性的?
java代码如下:
instance = new Instance(); //instance是volatile修饰的变量 对它进行写操作,转为汇编语言
汇编代码 : xxxxx ; lock add1 $0*0,($esp);
lock前缀的指令在多核处理器下,触发两件事:
1> 将当前处理器缓冲行的数据写入到内存中
2> 这个写操作会使得在其他cpu里面缓存了该内存地址的数据无效
为了提高处理速度,处理器不会直接和内存进行通信,而是将系统内存的数据读到内部缓存中后在进行操作,但是操作完不知道何时写入到内存中。如果对volatile变量执行写操作,jvm会向处理器发送一个lock前缀的指令,将这个变量所在缓存行的数据写入到内存中。但是,如果其他处理器缓存的值还是旧的,在执行运算还是有差错的,所以,在多处理器下,为了保证各个处理器缓存数据的一致,会实现缓存一致性协议。
每个处理器嗅探在总线上传播的数据来检查自己缓存的值是否过期了,当处理器发现自己缓存行对应的内存地址被修改时候,就会将当前处理器的缓存行的数据设置为无效状态,当处理器对这个数据进行修改,就会重新冲内存中取值,读到缓存行中。
总的来说,volatile的两条实现原则
1> lock前缀的指令会将处理器缓存会写到内存中。
2> 一个处理器的缓存会写到内存中会导致其他处理器的缓存无效。
- java并发编程学习(二) volatile
- Java多线程并发编程之二volatile
- Java并发编程(二)——volatile
- java并发编程---volatile
- Java并发编程:volatile
- java并发编程 volatile
- 【Java并发编程】(二)——volatile
- java并发编程(二)--volatile关键字解析
- java并发编程的艺术(二)-----volatile、synchronized、final
- Java并发编程实战-章二~volatile的思考
- Java并发之volatile二
- java并发编程实践 volatile
- Java并发编程-volatile变量
- java并发编程 -volatile关键字
- Java并发编程:volatile详解
- java并发编程(8)--volatile
- Java并发编程--Volatile详解
- java并发编程---volatile关键字
- 工作中常用的几个git命令
- HTML和CSS入门(6)
- 前端解决ios手机竖拍上传图片旋转90° 完美适配:Android/ios/Windows
- 英国金融行为监管局针对加密货币差价合约提出警告
- java堆、栈、堆栈的区别
- java并发编程学习(二) volatile
- Hdfs扩容操作
- 芝加哥公司DRW将在新加坡设置比特币交易点
- 高并发服务设计——缓存
- 《分布式资本链周刊》第二期
- 【云星数据---Apache Flink实战系列(精品版)】:Apache Flink高级特性与高级应用019-Flink中参数传递和容错设定003
- 使用MockMvc测试带有异步方法所踩的坑及解决办法
- git的使用
- linux -- tcpdump