当前位置:网站首页>【面试:并发篇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的变量写之前的代码不会出现在写屏障之后 这就保证了 这个变量的位置固定,同时读屏障保证了读屏障之后的代码不会出现在读屏障之前 也保证了位置固定,所以在写这个变量时 这个变量不会出现指令重排序,读这个变量时 这个变量也不会出现指令重排序,保证了有序性。
边栏推荐
猜你喜欢
随机推荐
【板栗糖GIS】arcmap—如何快捷替换属性表中的部分内容
linkedlist的用处之一:通过结构体成员的地址获取结构体变量的地址
php反序列化结构知识点实例分析
高性能数据访问中间件 OBProxy(三):问题排查和服务运维
GBASE 8s 数据库复合索引
JZ6 从尾到头打印链表
NC193 二叉树的前序遍历
GBASE 8s 自动删除正在被使用的数据库
JVM 上数据处理语言的竞争:Kotlin, Scala 和 SPL
SAP MIGO 报错-在例程WERT_SIMULIEREN字段NEUER_PREIS中字段溢出
研究生怎么申请专利,流程是什么?
文献综述的写作技巧,掌握这些技巧,效率大大提高!
go语言中的goroutine(协程)
GBASE 8s 数据库的恢复
lambda表达式
GBASE 8s 通过light scan优化查询性能
"Introduction to nlp + actual combat: Chapter 7: Dataset loading in pytorch and the use of its own datasets"
线性回归的多种实现方式
Baidu Intelligent Cloud Zhangmiao: Detailed explanation of enterprise-level seven-layer load balancing open source software BFE
i2c时序图的详细讲解[通俗易懂]






