当前位置:网站首页>【面试:并发篇29:多线程:volatile】原理
【面试:并发篇29:多线程:volatile】原理
2022-07-29 22:19:00 【I cream】
【面试:并发篇29:多线程:volatile】原理
00.前言
如果有任何问题请指出,感谢。
01.介绍
volatile的底层实现原理是内存屏障
1.对volatile变量的写指令后会加入写屏障
2.对volatile变量的读指令前会加入读屏障
02.volatile保证可见性原理
写屏障:保证在该屏障之前的,对共享变量的改动都同步到主存当中。
public void actor2(I_Result r){
num = 2;
ready = true; // ready是volatile修饰的,且ready是写操作
// ready后有写屏障
}
读屏障:保证在该屏障之后,对共享变量的读取,加载的是主存中的最新数据
public void actor1(I_Result r){
// 因为ready是读操作
// 在ready之前有读屏障
if(ready){
r.r1 = num + num;
}else{
r.r1 = 1;
}
}
解释
写屏障可以保证自己和自己之前的共享变量 都同步到主存中,就像这里的num = 2是在ready = true之前,那么共享变量ready与num都会同步到主存当中
读屏障则是可以保证自己和自己之后的共享变量读取都是最新的,例如这里if(ready)就读取了ready 还有 r.r1 = num + num,这里读取了num
总结:通过读写屏障保证了 加了volatile的变量不论是写还是对都是最新的数据,且 对于写之前 读之后的数据也都是最新数据。这就是可见性实现的原理。
03.volatile保证有序性原理
写屏障:确保指令重排序时,不会将写屏障之前的代码排在写屏障之后。
public void actor2(I_Result r){
num = 2;
ready = true; // ready是volatile修饰的,且ready是写操作
// ready后有写屏障
}
读屏障:确保指令重排序时,不会将读屏障之后的代码排在读屏障之前。
public void actor1(I_Result r){
// 因为ready是读操作
// 在ready之前有读屏障
if(ready){
r.r1 = num + num;
}else{
r.r1 = 1;
}
}
解释
写屏障确保指令重排序时,不会将写屏障之前的代码排在写屏障之后,例如这个例子中的ready = true是读操作,保证了ready之前的代码不会出现在ready之后
读屏障则是确保指令重排序时,不会将读屏障之后的代码排在写屏障之前,例如这个例子中的if(ready)保证了ready之后的代码不会出现在ready之前,不过这里ready不存在这个问题 因为这里只有ready为true时才能进入
总结:通过读写屏障保证了 加了volatile的变量写之前的代码不会出现在写屏障之后 这就保证了 这个变量的位置固定,同时读屏障保证了读屏障之后的代码不会出现在读屏障之前 也保证了位置固定,所以在写这个变量时 这个变量不会出现指令重排序,读这个变量时 这个变量也不会出现指令重排序,保证了有序性。
边栏推荐
猜你喜欢

Docker 下 Oracle 安装与配置

OPEN数据 | 新库上线 | CnOpenDataA股上市公司社会责任报告数据
![[BUG]memset和成员初始化的先后顺序](/img/30/882bdebc809724eb2557a7b7c850ae.png)
[BUG]memset和成员初始化的先后顺序

毕业论文文献综述写作技巧,超级详细!

新库上线 | CnOpenData国际货运代理信息数据

Add a logo to the upper left corner of the picture, add time and address to the lower left corner, and wrap the line when the address reaches the specified length

中科院TextMind(文心)安装及使用

将文件流转成file文件后使用luckysheet回显数据

刀具更换策略问题(完工)

GBASE 8s 数据库的恢复
随机推荐
C. Color the Picture(贪心/构造)
撰写英文文献有哪些技巧?
DD1 连续最大和
Emgucv环境配置[通俗易懂]
GBASE 8s 如何估算索引使用多少空间
程序员「小镇做题」出身,月薪是父母半年收入 ……
华为畅享50 Pro评测:HarmonyOS加持 更流畅更安全
SQL 改写系列七:谓词移动
【微信小程序】一文解忧,事件绑定
03-树3 Tree Traversals Again(树的遍历)
【Verilog 设计】Verilog 实现偶数、奇数分频和任意小数分频
基于zigbee的智能管理系统[通俗易懂]
D. Rain(思维/线性代数/差分数组)
二、HikariCP源码分析之获取连接流程二
GBASE 8s自定义存储过程和函数介绍
一级建造师从业者面试需要注意什么问题?
GBASE 8s 数据库的逻辑日志备份
Advanced Mathematics (Seventh Edition) Tongji University Exercises 3-8 Individual Answers
Spark读取多目录
[Point Cloud] M3DeTR: Multi-representation, Multi-scale, Mutual-relation 3D Object Detection with Transformers