1. 并发编程的可见性问题

2. 并发编程的有序性问题

3. 使用volatile关键字解决可见性问题

4. 可见性问题的本质——缓存不一致

因为cpu执行速度很快,但是内存执行速度相对于CPU很慢,那么每次从内存取数据就拖慢了CPU的执行效率。实际上,在CPU和内存中有一层缓存,程序执行时在缓存操作数据,那么另一个缓存修改的数据是不会更新到当前程序缓存中的,也就出现了缓存不一致问题,也就出现了可见性问题。简易内存模型图如下。

5. 有序性问题的本质——指令重排

因为CPU或者编译器为了优化程序指令,会对没有依赖关系的程序指令进行重排。对于单线程来说,指令没有依赖关系,重排没有问题,但如果是并发编程,那么指令重排是有影响的。

6. volatile是怎么解决可见性、有序性问题的呢?也就是怎么解决缓存不一致和禁止指令重排的呢?

6.1 缓存不一致问题:存在该问题是某个线程只修改自己缓存的数据,没有将数据刷新到内存中,或者另一个线程只从自己的缓存读取数据,没有从内存中取数据,造成了数据“不可见”。如果有一种协议,当某个线程修改缓存数据后,数据会被刷新到内存中,同时让其他线程的缓存数据失效,重新从内存读取,那么就解决缓存不一致问题了。这个协议就是MESI缓存一致性协议,MESI表示缓存数据(通过缓存行存储,64个字节)的四种状态字母缩写,四种状态如下,当触发了MESI协议,就能保证数据一致,也就是保证了数据的可见性。volatile就是通过触发MESI协议来保证数据可见的。

① Modified:数据只在当前线程的缓存中,且缓存数据与内存数据不一致。

② Exclusive:数据只在当前线程的缓存中,且缓存与内存数据一致。

③ Shared:数据存在于多个线程的缓存中,且缓存数据与内存一致。

④ Invalid:数据无效。

6.2 禁止指令重排:对于指令重排序,我们设置某些规则,当CPU或编译器检测到指令存在这些规则,那么不进行指令重排,即可解决有序性问题。内存屏障对于volatile数据的读或者写操作时,会加入对应内存屏障来保证指令的有序性。具体有哪些内存屏障,以及内存屏障为什么是那样的设置,这里就不多叙述了,volatile写之前有StoreStore屏障,之后有StoreLoad屏障(万能屏障,兼具其它三种屏障功能);volatile读之后有LoadStore和LoadLoad屏障

两个例子详解并发编程的可见性问题和有序性问题,通过volatile保证可见性和有序性以及volatile的底层原理——缓存一致性协议MESI和内存屏障禁止指令重排相关推荐

  1. 并发编程中的可见性——缓存一致性协议MESI

    一.应用场景展示--多线程计数 1.全局原子操作计数的数据流图 核心问题就是不同CPU如何在同一时刻看到同样的全局变量值. 2.每线程自增计数的数据流图 二.cache原理和实现 1. cache g ...

  2. 03弱引用内存泄露和hash冲突-ThreadLocal详解-并发编程(Java)

    文章目录 1 问题 2 内存泄露 3 弱引用 4 问题分析 4.1 key为强引用 4.2 key为弱引用 4.3 内存泄漏的真正原因 4.4 为什么Entry 的key使用弱引用 5 hash冲突的 ...

  3. 01入门-ThreadLocal详解-并发编程(Java)

    文章目录 1 简介 2 基本使用 2.1 常用方法 2.2 小案例 3 ThreadLocal与Sycronized 4 应用场景 4.1 转账案例构建 4.2 问题 4.3 解决 5 后记 1 简介 ...

  4. CPU处理器一致性协议MESI详解

    CPU处理器缓存一致性协议MESI详解 缓存一致性的由来 MESI协议简介 Exclusive状态 Shared状态 Modified和Invalid状态 MESI状态切换 Modified状态跳转 ...

  5. MESI缓存一致性协议详解

    MESI缓存一致性协议详解 1.CPU为何要有高速缓存 CPU中内置了少量的高速缓存以解决I\O速度和CPU运算速度之间的不匹配问题. 带有高速缓存的CPU执行计算的流程 程序以及数据被加载到主内存 ...

  6. “了解高并发底层原理”,面试官:讲一下MESI(缓存一致性协议)吧

    目录 前言: 1.什么是(Who): 2.为何来(How): 2.1缓存不一致带来的后果 2.2解决方法: 3.是什么(What) 3.1数据在缓存中的四种状态: 3.2MESI的六种消息(请求消息和 ...

  7. 论vue3.0和vue2.0区别之编程方式及例子详解

    系列文章目录 第一章 论vue3.0和vue2.0区别之编程方式及例子详解 第二章 同一台电脑 实现 vue-cli2和vue-cli3同时并存 及 常见命令 第三章 vue3.0项目实战 - Ele ...

  8. Python算法教程第一章知识点:利用插入元素的例子详解list之本质

    声明:由于中译本翻译过于冗余,所以将有用处的知识点罗列出来. 微信公众号:geekkr 本文目录:一.利用插入元素的例子详解list之本质 </br> 一.利用插入元素的例子详解list之 ...

  9. 并发编程之CPU缓存架构缓存一致性协议详解(二)

    并发编程之CPU缓存架构&缓存一致性协议详解 CPU高速缓存(Cache Memory) CPU高速缓存 在CPU访问存储设备时,无论是存取数据抑或存取指令,都趋于聚集在一片连续的区域中,这就 ...

最新文章

  1. 057 Insert Interval 插入区间
  2. CentOS6.3配置yum源
  3. exe4j打包exe_Java日常实用技巧之程序打包为可执行文件
  4. shopee本土店怎么做,一些运营技巧分享
  5. 细水长flow之NICE:流模型的基本概念与实现
  6. 【mysql】Innodb三大特性之double write
  7. Linux下修改只读文件
  8. 腾讯阿里达成“共识”!马化腾称“用链量”“用云量”或成数字时代的重要指标...
  9. 【js】js传递对象
  10. [读书笔录]解析卷积神经网络(魏秀参)——第一章
  11. Linux开发板烧录实验
  12. 每天10道Crypto Day3
  13. 【例6-19】求字符串长度函数strlen()
  14. JAVA演出购票系统计算机毕业设计Mybatis+系统+数据库+调试部署
  15. 查询oracle中所有的用户,如何查询Oracle中所有用户信息
  16. 解决Rabbitmq连接超时问题
  17. Kindle Windows版本 中文字体修改工具
  18. 计算机经典书籍电子书合集
  19. 计算机桌面图标管理,桌面图标怎么管理 桌面图标管理方法介绍
  20. ASP.NET中 RadioButtonList(单选按钮组)的使用

热门文章

  1. 反查BOM, 找出它的上阶
  2. 8、Power Map—实例:制作独立播放的视频
  3. SAP作业类型应用简介
  4. FIELD-SYMBOLS详解
  5. 月饼怎么吃才不胖,数据分析师教你选月饼
  6. 从《我要投资》,看麓谷基金广场的“孤峰优势”
  7. 坐拥双妹、佰草集,上海家化是怎样将一只脚留在高端护肤品门外的?
  8. 为什么美团打车、滴滴外卖必败?君智谢伟山揭秘了背后的竞争战略逻辑
  9. linux中jpg文件,Linux下压缩和优化jpg与png图片的方法
  10. js手机端时间区间_js 时间区间