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层级图示: