两个例子详解并发编程的可见性问题和有序性问题,通过volatile保证可见性和有序性以及volatile的底层原理——缓存一致性协议MESI和内存屏障禁止指令重排
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和内存屏障禁止指令重排相关推荐
- 并发编程中的可见性——缓存一致性协议MESI
一.应用场景展示--多线程计数 1.全局原子操作计数的数据流图 核心问题就是不同CPU如何在同一时刻看到同样的全局变量值. 2.每线程自增计数的数据流图 二.cache原理和实现 1. cache g ...
- 03弱引用内存泄露和hash冲突-ThreadLocal详解-并发编程(Java)
文章目录 1 问题 2 内存泄露 3 弱引用 4 问题分析 4.1 key为强引用 4.2 key为弱引用 4.3 内存泄漏的真正原因 4.4 为什么Entry 的key使用弱引用 5 hash冲突的 ...
- 01入门-ThreadLocal详解-并发编程(Java)
文章目录 1 简介 2 基本使用 2.1 常用方法 2.2 小案例 3 ThreadLocal与Sycronized 4 应用场景 4.1 转账案例构建 4.2 问题 4.3 解决 5 后记 1 简介 ...
- CPU处理器一致性协议MESI详解
CPU处理器缓存一致性协议MESI详解 缓存一致性的由来 MESI协议简介 Exclusive状态 Shared状态 Modified和Invalid状态 MESI状态切换 Modified状态跳转 ...
- MESI缓存一致性协议详解
MESI缓存一致性协议详解 1.CPU为何要有高速缓存 CPU中内置了少量的高速缓存以解决I\O速度和CPU运算速度之间的不匹配问题. 带有高速缓存的CPU执行计算的流程 程序以及数据被加载到主内存 ...
- “了解高并发底层原理”,面试官:讲一下MESI(缓存一致性协议)吧
目录 前言: 1.什么是(Who): 2.为何来(How): 2.1缓存不一致带来的后果 2.2解决方法: 3.是什么(What) 3.1数据在缓存中的四种状态: 3.2MESI的六种消息(请求消息和 ...
- 论vue3.0和vue2.0区别之编程方式及例子详解
系列文章目录 第一章 论vue3.0和vue2.0区别之编程方式及例子详解 第二章 同一台电脑 实现 vue-cli2和vue-cli3同时并存 及 常见命令 第三章 vue3.0项目实战 - Ele ...
- Python算法教程第一章知识点:利用插入元素的例子详解list之本质
声明:由于中译本翻译过于冗余,所以将有用处的知识点罗列出来. 微信公众号:geekkr 本文目录:一.利用插入元素的例子详解list之本质 </br> 一.利用插入元素的例子详解list之 ...
- 并发编程之CPU缓存架构缓存一致性协议详解(二)
并发编程之CPU缓存架构&缓存一致性协议详解 CPU高速缓存(Cache Memory) CPU高速缓存 在CPU访问存储设备时,无论是存取数据抑或存取指令,都趋于聚集在一片连续的区域中,这就 ...
最新文章
- 057 Insert Interval 插入区间
- CentOS6.3配置yum源
- exe4j打包exe_Java日常实用技巧之程序打包为可执行文件
- shopee本土店怎么做,一些运营技巧分享
- 细水长flow之NICE:流模型的基本概念与实现
- 【mysql】Innodb三大特性之double write
- Linux下修改只读文件
- 腾讯阿里达成“共识”!马化腾称“用链量”“用云量”或成数字时代的重要指标...
- 【js】js传递对象
- [读书笔录]解析卷积神经网络(魏秀参)——第一章
- Linux开发板烧录实验
- 每天10道Crypto Day3
- 【例6-19】求字符串长度函数strlen()
- JAVA演出购票系统计算机毕业设计Mybatis+系统+数据库+调试部署
- 查询oracle中所有的用户,如何查询Oracle中所有用户信息
- 解决Rabbitmq连接超时问题
- Kindle Windows版本 中文字体修改工具
- 计算机经典书籍电子书合集
- 计算机桌面图标管理,桌面图标怎么管理 桌面图标管理方法介绍
- ASP.NET中 RadioButtonList(单选按钮组)的使用