并发内存模型JMM与内存屏障

案例

在这里插入图片描述
并不会跳出死循环,可以加关键词volatile

cpu并发缓存架构

在这里插入图片描述
因为内存的速率发展不快,cpu寄存器和缓存速率差不多
在这里插入图片描述

原子操作

硬件层面
在这里插入图片描述
在这里插入图片描述

缓存一致性协议MESI

开启后保证数据的可见性
线程2修改后立刻立刻写回到内存

cpu总线嗅探机制(监听)

嗅探到该变量被修改,使线程1的工作内存的值置为invalid,cpu要使用的时候需要重新从内存读
在这里插入图片描述

volatile底层原理

变量在汇编级别指令会加上lock前缀指令
在这里插入图片描述
在这里插入图片描述

重排序

在这里插入图片描述

as-if-serial语义

重排序遵循as-if-serial语义原则,即不管怎么重排序,(单线程)程序的执行结果不能被改变,编译器和处理器不会对存在数据依赖关系的操作做重排序

happens-before原则

锁原则

解锁必然发生在同一个锁加锁之前

volatile原则

volatile变量的写先发生于读,每次被线程访问时都强迫从主内存中读该变量的值,当该变量发生变化时,又会强迫将最新的值刷新到主内存。

单例模式双重检测锁DCL(DoubleCheckLock

多线程并发模式下都进入到sync代码行,一个线程初始化后其他线程仍然可能初始化所以需要第二层if check。
在这里插入图片描述

对象半初始化

但还需要加volatile关键词
比如单例模式中new 那一步指令可能重排序,返回了一个没有构造函数进行初始化的new出来的对象。

内存屏障

JVM规范定义的

在这里插入图片描述
在这里插入图片描述
比如hotspot底层c++实现方法:
在这里插入图片描述

不同的cpu硬件,hotspotJDK有不同的底层实现
在这里插入图片描述
Linux实现,应用汇编lock前缀指令,会在硬件提供内存屏障,lock前后指令均不会重排序。
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Una*

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值