调用顺序
volatile -> cpp -> asm -> lock addl
关键:asm中的 ** **lock addl
特性:
- 线程间的可见性 当线程的数据修改之后会通知其他线程缓存失效, 其他线程需要重新读取主内存的数据,读取或者通知的单位是基于缓存行的,以一个缓存行为一个单位,进行通知,重新读取,一般是64byte, 这就会导致伪共享,比如 ;
```
int a ;
int b ;
//如果 a 和 b 是位于同一个缓存行
线程1 频繁修改a数据, 线程2频繁 修改a数据 ,由于是位于一个缓存行,所以会相互通知,
不断频繁去主内存读取,到时耗性能
知识点: 缓存一致性协议
如果改为:
int a ; int p1,p2,p3,p4,p5,p6,p7,p8,p9,p10,p11,p12,p13,p14,p15 ; int b ;
```
- 防止指令重排序 (内存屏障barriers, 每个虚拟机的实现都实现了虚拟机规范: LS LL SS SL )
最初的应用框架: Disruptor
参考: http://ifeve.com/disruptor-cacheline-padding/
https://www.jianshu.com/p/c3c108c3dcfd
**