JMM 内存模型数据原子操作
流程:
read(读取):从主内丰读取数据
load(载入):将主内存读取到的数据写入工作内存
use(使用):从工作内存读取数据来计算
assign(赋值):将计算好的值重新赋值到工作内存中
store(存储):将工作内存数据写入主内存
write(写入):将store过去 的变量值赋值给主内存中的变量
lock(锁定):将主内存变量加锁,标识为线程独占状态
unlock(解锁):将主内存变量解锁,解锁后其他线程可以锁定该变量
JMM缓存不一致问题解决方案
1.总线加锁(性能太低)
CPU从主内存读取数据到高速缓存,会在总线对这个数据加锁,这样其它CPU没法去读或写这个数据,直到这个CPU使用完数据释放锁之后其它CPU才能读取该数据
2.MESI缓存一致性协议
多个CPU从主内存读取同一个数据到各自的高速缓存,当其中某个CPU修改了缓存里的数据,该数据马上同步回主内存,其它CPU通过总线嗅探机制可以感知到数据的变化,从而将自己缓存里的数据失效
Volatile缓存可见性实现原理
底层实现主怵是通过 汇编lock前缀指令,它会锁定这块内存区域的缓存(缓存行锁定)并回写到主内存
IA-32架构软件开发者手册对lock指令的理解:
1)会将当前处理器缓存行为的数据立即写回到系统内存
2)这个写回内存的操作会引起在其他CPU里缓存了该 内存地址的数据无效(MESI协议)
Java程序汇编代码查看
-server -Xcomp -XX:+UnlockDiagnosticVMOptions -XX:+PrintAssembly -XX:CompileCommand=compileonly,*VolatileVisibilityTeys.prepareDate
Volatile可见性、原子性与有序性
并发编程三大特性:可见性、原子性、有序性
volatile保证 可见性与有序性,但不保证原子性,保证 原子 性需要借助synchronized这样的锁机制
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】