总线:理解“CPU”与“主内存”交互数据的方式是通实际存在电线传输的,MESI协议是“cpu”底层在总线级别的一种实现;实现过程(总线开启MESI):CPU就会对总线的数据开启监听(嗅探)变量值,当某个线程修改了变量值副本值,刷新到主内存时就会触发嗅探,(目的实现缓存一致性,线程可见性)主内存原值失效重新赋值,其他cpu嗅探到时,先失效掉自己value,然后重新到主内存read-get值
volatile汇编源码:也就在所在行加了“lock”枷锁,直接写入主内存,同时会经过总线(ESMI)会激起嗅探机制
ps: Q1:不加lock ? A:不加会存在多线程一致性问题
2: Q: lock的位置最优? A:lock会让并行变串行,所以不能穿插业务,影响效率,所以必须枷锁而且还要效率高,所以只在进行赋值(内存地址切换指针)时lock,消耗最少效率安全都最高;
volatile 它保证了多线程的可见性和有序性,但是无法保证多线程的原子性,多线程同时运行时,1线程修改变量时就会出现2线程原值”失效“进而重新read主内存,导致数据丢失;不过可以利用synchronized锁机制解决,详见如图