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这样的锁机制 

 

  

 

  

 

posted @   白一粥  阅读(118)  评论(0编辑  收藏  举报
编辑推荐:
· 如何编写易于单元测试的代码
· 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】
点击右上角即可分享
微信分享提示