天天看点

JMM底层原理

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

继续阅读