Java并发之深度解析volatile
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了Java并发之深度解析volatile,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2443字,纯文字阅读大概需要4分钟。
内容图文
![Java并发之深度解析volatile](/upload/InfoBanner/zyjiaocheng/718/ecbfad17448148ef9babd8bdd4b037e4.jpg)
1.首先复习一下CPU和JMM的关系:
CPU缓存模型
硬件:
CPU 中有 寄存器
Cache:包含L1i和L1d,L2,L3缓存
内存
eg:CPU想要计算i++的步骤如下:
Cache缓存会将 i 拷贝一个副本到缓存当中,然后寄存器对i进行读取然后 i++操作返回给 Cache 最后把 Cache的数据更新到内存当中
如果此时有两个线程,一个只做i++写入内存,一个从内存读取,那么他们就会出现CPU缓存的一致性问题。
解决方案:
1)总线加锁(粒度太大)
2)MESI
a. 读操作:不做任何事情,把Cache中的数据读到寄存器
b. 写操作:发出信号通知其他的CPU将该变量的Cache line置为无效,其他的CPU要访问这个变量的时候,只能从内存中获取。
Cache line是CPU的实现机制, CPU的cache中会增加很多的Cache line
JMM模型:
- 主存中的数据所有线程都可以访问(共享数据)
- 每个线程都有自己的工作空间,(本地内存)(私有数据)
- 工作空间数据:局部变量、内存的副本
- 线程不能直接修改内存中的数据,只能读到工作空间来修改,修改完成后刷新到内存
2.Volatile关键字的语义分析
volatile作用:让其他线程能够马上感知到某一线程多某个变量的修改
- 保证可见性
对共享变量的修改,其他的线程马上能感知到
不能保证原子性 读、写、(i++) - 保证有序性
重排序(编译阶段、指令优化阶段)
输入程序的代码顺序并不是实际执行的顺序
重排序后对单线程没有影响,对多线程有影响
Volatile
Happens-before
volatile规则:
对于volatile修饰的变量:
(1)volatile之前的代码不能调整到他的后面
(2)volatile之后的代码不能调整到他的前面(as if seria)
(3)霸道(位置不变化)
Int i=0;
Int a=3;
Int b=5;
Volatile Int j=3;
Int i=0;
Int a=3;
Int b=5;
Int m=i+j;
I++;
J++;
(3)volatile的原理和实现机制(锁、轻量级)
HSDIS --反编译—汇编
Java --class—JVM—>ASM文件
Volatile int a ;
Lock :a
3.Volatile的使用场景
(1)状态标志(开关模式)
public class ShutDowsnDemmo extends Thread{
private volatile boolean started=false;
@Override
public void run() {
while(started){
dowork();
}
}
public void shutdown(){
started=false;
}
}
(2)双重检查锁(duble-checked-locking)
DCL
public class Singleton {
private volatile static Singleton instance;
public static Singleton getInstance(){
if(instance==null){
synchronized (Singleton.class){
instance=new Singleton();
}
}
return instance;
}
}
(3)需要利用顺序性
4.volatilt 与 synchronized 的区别
- 使用上的区别
Volatile只能修饰变量,synchronized只能修饰方法和语句块 - 对原子性的保证
synchronized可以保证原子性,Volatile不能保证原子性 - 对可见性的保证
都可以保证可见性,但实现原理不同
Volatile对变量加了lock,synchronized使用monitorEnter和monitorexit monitor JVM - 对有序性的保证
Volatile能保证有序,synchronized可以保证有序性,但是代价(重量级)并发退化到串行 - 其他
synchronized引起阻塞
Volatile不会引起阻塞
内容总结
以上是互联网集市为您收集整理的Java并发之深度解析volatile全部内容,希望文章能够帮你解决Java并发之深度解析volatile所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。