【八股文】volatile关键字的底层原理是什么
volatile只能保证可见性和有序性
volatile如何保证可见性
当对volatile变量进行写操作的时候,JVM会向处理器发送一条lock前缀的命令,将这个缓存中的变量会写到系统内存中。
所以,如果一个变量被volatile所修饰,每次数据变化之后,其值都会被强制刷入主存。而其他处理器由于遵守缓存一致性协议,也会把这个变量的值从主存加载到自己的缓存中。这就保证了volatile修饰的值在多个缓存中是可见的。
什么是缓存一致性协议
由于CPU和主存的处理速度上存在一定差别,为了匹配这种差距,会在CPU和主存之间增加多层高速缓存(L1\L2\L3), 再加上多核计算机有多个CPU,所以就会出现多套缓存之间数据不一致的现象。
缓存一致性(MESI)的核心思想:
当CPU写数据时,如果发现操作的变量是共享变量,即在其他CPU中也存在该变量的副本,会发出信号通知其他CPU将该变量的缓存置为无效状态,因此其他CPU需要读取这个变量时,只能从内存中重新读取。
volatile如何保证有序性
普通的变量仅仅会保证在该方法的执行过程中所依赖的赋值结果的地方能获得正确的结果,而不能保证变量的赋值操作的顺序和代码顺序一致
volatile通过内存屏障来禁止指令重排,保证了代码严格按照编写的顺序执行,这样就保证了有序性。