Java并发——volatile
2024-09-03 04:19:23
CPU的内存模型如下:
这种模式下,存在多核间缓存数据不一致的问题。为了解决这种问题,有2种硬件策略。
1.当一个CPU从主存读取缓存数据时,总线阻塞;
2.基于缓存一致性协议,当一个CPU读取到共享缓存时,如果某个CPU对共享缓存发生变更操作,会通知其它CPU缓存无效,触发其它CPU重新读主存。
JMM抽象的内存模型如下:
JMM是对硬件平台内存模型的抽象。
这个模型解释了JVM在内存中存取变量的动作。
因为只是对底层的抽象,出于性能考虑,存在一致性与指令重排等一些问题。解决这些问题有如下策略:
1.基于内存屏障,在读写共享变量的前后加入相应的屏障指令,阻止共享变量前后的指令重排;
2.基于缓存一致性协议,确保共享变量的写会及时通知所有的CPU。
内存屏障分类如下:
JMM定义的指令重排序规则:
volatile基于内存屏障来保证可见性与阻止指令重排(HB关系)。
- 在每个volatile写操作的前面插入一个StoreStore屏障;
- 在每个volatile写操作的后面插入一个StoreLoad屏障;
- 在每个volatile读操作的后面插入一个LoadLoad屏障;
- 在每个volatile读操作的后面插入一个LoadStore屏障。
StoreStore屏障:禁止上面的普通写和下面的volatile写重排序
StoreLoad屏障:防止上面的volatile写与下面可能有的volatile读/写重排序
LoadLoad屏障:禁止下面所有的普通读操作和上面的volatile读重排序
LoadStore屏障:禁止下面所有的普通写操作和上面的volatile读重排序
参考:
最新文章
- Asp.Net Core 项目实战之权限管理系统(0) 无中生有
- Java中有关Null的9件事
- Nginx学习笔记(八) Nginx进程启动分析
- K2与OData和Swagger集成,从任何设备无需代码获取数据
- Android开发UI之Fragment-Tabbed Activity的使用
- 启动php-fpm报错:please specify user and group other than root
- PHP PSR-2 代码风格规范 (中文版)
- hdu1114Piggy-Bank(DP完全背包)
- 【树莓派】修改树莓派盒子MAC地址
- 平面上给定n条线段,找出一个点,使这个点到这n条线段的距离和最小。
- OpenCV4.1.0实践(3) - 图片缩放
- scala-创建泛型数组(T: Manifest)
- 【Spark深入学习 -10】基于spark构建企业级流处理系统
- 如何搭建一个 MySQL 分布式集群
- angular的启动原理
- BZOJ4475 [Jsoi2015]子集选取
- MVC与MVP(转)
- 【bzoj4800】: [Ceoi2015]Ice Hockey World Championship dfs
- 敏捷DoD完毕定义的多种形态
- JS移动端浏览器取消右划后退的几种方法