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读重排序
 
参考:

最新文章

  1. Asp.Net Core 项目实战之权限管理系统(0) 无中生有
  2. Java中有关Null的9件事
  3. Nginx学习笔记(八) Nginx进程启动分析
  4. K2与OData和Swagger集成,从任何设备无需代码获取数据
  5. Android开发UI之Fragment-Tabbed Activity的使用
  6. 启动php-fpm报错:please specify user and group other than root
  7. PHP PSR-2 代码风格规范 (中文版)
  8. hdu1114Piggy-Bank(DP完全背包)
  9. 【树莓派】修改树莓派盒子MAC地址
  10. 平面上给定n条线段,找出一个点,使这个点到这n条线段的距离和最小。
  11. OpenCV4.1.0实践(3) - 图片缩放
  12. scala-创建泛型数组(T: Manifest)
  13. 【Spark深入学习 -10】基于spark构建企业级流处理系统
  14. 如何搭建一个 MySQL 分布式集群
  15. angular的启动原理
  16. BZOJ4475 [Jsoi2015]子集选取
  17. MVC与MVP(转)
  18. 【bzoj4800】: [Ceoi2015]Ice Hockey World Championship dfs
  19. 敏捷DoD完毕定义的多种形态
  20. JS移动端浏览器取消右划后退的几种方法

热门文章

  1. Python3+Appium学习笔记02-环境配置(下)
  2. vsftpd的安装和配置
  3. http方式获取远程文件内容
  4. osm3ge
  5. request.getParameterNames获得请求参数的名字(Get或者Post请求的参数都可以)
  6. C# 操作服务命令
  7. 自己编写一个Java监听器
  8. qt install (1)
  9. 11.17 模拟赛&&day-2
  10. 阿里云Ubuntu安装LNMP环境之Nginx