流程:
read(读取):从主内丰读取数据
load(载入):将主内存读取到的数据写入工作内存
use(使用):从工作内存读取数据来计算
assign(赋值):将计算好的值重新赋值到工作内存中
store(存储):将工作内存数据写入主内存
write(写入):将store过去 的变量值赋值给主内存中的变量
lock(锁定):将主内存变量加锁,标识为线程独占状态
unlock(解锁):将主内存变量解锁,解锁后其他线程可以锁定该变量
1.总线加锁(性能太低)
CPU从主内存读取数据到高速缓存,会在总线对这个数据加锁,这样其它CPU没法去读或写这个数据,直到这个CPU使用完数据释放锁之后其它CPU才能读取该数据
2.MESI缓存一致性协议
多个CPU从主内存读取同一个数据到各自的高速缓存,当其中某个CPU修改了缓存里的数据,该数据马上同步回主内存,其它CPU通过总线嗅探机制可以感知到数据的变化,从而将自己缓存里的数据失效
底层实现主怵是通过 汇编lock前缀指令,它会锁定这块内存区域的缓存(缓存行锁定)并回写到主内存
IA-32架构软件开发者手册对lock指令的理解:
1)会将当前处理器缓存行为的数据立即写回到系统内存
2)这个写回内存的操作会引起在其他CPU里缓存了该 内存地址的数据无效(MESI协议)
-server -Xcomp -XX:+UnlockDiagnosticVMOptions -XX:+PrintAssembly -XX:CompileCommand=compileonly,*VolatileVisibilityTeys.prepareDate
并发编程三大特性:可见性、原子性、有序性
volatile保证 可见性与有序性,但不保证原子性,保证 原子 性需要借助synchronized这样的锁机制
原文:https://www.cnblogs.com/baizhou168/p/14330972.html