一:JMM数据原子操作
8大原子操作
1:read(读取):从主内存读取数据
2:load(载入):将主内存读取到的数据载入到工作内存
3:use(使用):从工作内存读取数据计算
4:assign(赋值):将计算好的值重新赋值到工作内存中
5:store(存储):将工作内存写入到主内存
6:write(写入):将store过去的变量值赋值给主内存中的变量
7:lock(锁定):将主内存变量加锁,使其变成线程独占状态
8:unlock(解锁):将主内存变量解锁,解锁后其他线程可以锁定该变量
总线加锁(性能太低) 早期版本使用
CPU从主内存读取数据到高速缓存,会在总线对这个数据进行加锁,这样其他CPU就没法去读或写这个数据,直到这个CPU使用完数据并释放锁,其他CPU才能读取该数据
MESI缓存一致性协议(Modified修改 Exclusive独享互斥 share共享 invalid失效)
多个CPU从主内存读取同一个数据到自己的高速缓存,当其中某个CPU修改了缓存的数据,该数据会马上同步到主内存,其他CPU通过==总线嗅探机制==可以感知到数据的变化从而使自己缓存里的数据失效
二:Volatile关键字理解
查看汇编语言,导入两个包,hsdis-amd64.dll和hsdis-amd64.lib
Volatile缓存可见性实现原理
底层实现主要通过汇编lock前缀指令,他会锁定这块内存区域的缓存(缓存行锁定)并写回主内存
lock指令前缀
1.会将当前指令行的数据立即写回到系统内存中
2.这个写回内存的操作会经过总线,引起其他CPU触发总线嗅探机制,使得他们的缓存数据无效(MESI协议)
volatile底层也会对其加锁,但是在store之前加锁,和原始的总线加锁的时机不一样,锁的粒度大大降低,
三:并发编程的三大特性、
并发编程的三大特性
可见性
原子性
有序性
volatile保证可见性和有序性,不能保证原子性,保证原子性 需要借助synchronized这样的锁机制
转载:https://blog.csdn.net/weixin_44307391/article/details/101314139
查看评论