Volatile关键字
① volatile的两个特点
- 1 保证线程(CPU)之间的可见性;(也就是保证数据一致性)- 简单解释一下:一个线程将一个值的数值改变时,另一个使用该数值的线程能看到这种改变;
 
- 2 禁止指令重排序(禁止乱序执行);- 这个和单例模式的DCL(Double Check Lock 双锁检查机制)相关,面试会问你创建对象的引用变量是否需要加volatile?肯定要加,涉及到对象的创建过程;
 
New对象过程:
- 1 给对象实例分配内存;申请内存 
- 2 初始化对象的构造器;初始化 
- 3 将对象实例指向分配的内存空间(此时实例就非null了);建立关联 

② volatile底层原理
- 系统底层如何实现数据一致性? - 1 MESI如果能解决,就用MESI; 
- 2 如果不能,就用锁总线;(万能的) 
 
- 系统底层如何保证有序性? - 内存屏障; 
- 锁总线; 
 
- Volatile如何解决指令重排序? - 1 java代码层级:加volatile关键字; 
- 2 字节码层面:执行java代码,执行到volatile,字节码代码上加了一个ACC_VOLATILE关键字; 
- 3 JVM层级: 加屏障;屏障两边的指令不可以重排序;保障有序! 
- 4 hotspot实现:锁总线; 
- 5 更底层硬件实现,电信号:lock; 
 
JVM层级图示:
          
 
  
  
  
 
 
  
 