volatile底层原理,如何实现保证可见性的呢?如何实现保证有序性的呢?
volatile+原子性:不能保证原子性,虽说有些极端特殊的情况下有保证原子性的效果
极端场景:oracle、64位的long的数字进行操作时
【面试题】问volatile底层、java内存模型、问volatile是如何保证可见性的,缓存一致性协议,追问,volatile之后,具体是发送了什么指令去实现什么效果?
(1)#lock前缀指令(记住)、嗅探机制
MESI缓存一致性协议
对volatile修饰的变量,执行写操作的话,JVM会发送一条lock前缀指令给CPU,CPU在计算完成后会立即将这个值写回主内存,同时因为有MESI缓存一致性协议,所以各个CPU都会对总线进行嗅探,自己本地缓存中的数据是否被别人修改。
如果发现别人修改了某个缓存的数据,那么CPU会将自己本地缓存的数据过期掉,然后这个CPU上执行的线程在读取那个变量的时候,就会从主内存中重新加载最新的数据。
#lock前缀指令+MESI缓存一致性协议
(2)内存屏障:禁止指令重排
屏障类别:
- 每个volatile写操作前面,加StoreStore屏障,禁止上面的普通写和他重排
- 每个volatile写操作后面,加StoreLoad屏障,禁止和下面的volatile读、写重排
- 每个volatile读操作前面,加LoadLoad屏障,禁止上面的普通读和volatile读重排
- 每个volatile读操作后面,加LoadStore屏障,禁止下面的普