volatile底层原理,如何实现保证可见性的呢?如何实现保证有序性的呢?

可见性

1lock指令
对volatile修饰的变量,执行写操作的话,JVM会发送一条lock前缀指令给CPU,CPU在计算完之后会立即将这个值写回主内存,同时因为有MESI缓存一致性协议,所以各个CPU都会对总线进行嗅探,自己本地缓存中的数据是否被别人修改

如果发现别人修改了某个缓存的数据,那么CPU就会将自己本地缓存的数据过期,然后这个CPU上执行的线程在读取那个变量的时候,就会从主内存重新加载最新的数据。

lock前缀指令 + MESI缓存一致性协议

有效性

(2)内存屏障:禁止重排序

底层就是插入了XX内存屏障,XX内存屏障,就可以保证指令不会重排

对于volatile修改变量的读写操作,都会加入内存屏障

每个volatile写操作前面,加StoreStore屏障,禁止上面的普通写和他重排;每个volatile写操作后面,加StoreLoad屏障,禁止跟下面的volatile读/写重排

每个volatile读操作后面,加LoadLoad屏障,禁止下面的普通读和voaltile读重排;每个volatile读操作后面,加LoadStore屏障,禁止下面的普通写和volatile读重排

你可能感兴趣的:(volatile底层原理,如何实现保证可见性的呢?如何实现保证有序性的呢?)