目录
2.3.2、问题2: 共享的long和double变量的为什么要用volatile?
3.2.1、volatile 的 happens-before 关系
4.2、模式2:一次性安全发布(one-time safe publication)
4.3、模式3:独立观察(independent observation)
1、带着BAT大厂的面试问题去理解volatile
- volatile关键字的作用是什么?
- volatile能保证原子性吗?
- 之前32位机器上共享的long和double变量的为什么要用volatile? 现在64位机器上是否也要设置呢?
- i++为什么不能保证原子性?
- volatile是如何实现可见性的? 内存屏障。
- volatile是如何实现有序性的? happens-before等
- 说下volatile的应用场景?
2、volatile的作用详解
2.1、防重排序
我们从一个最经典的例子来分析重排序问题。大家应该都很熟悉单例模式的实现,而在并发环境下的单例实现方式,我们通常可以采用双重检查加锁(DCL)的方式来实现。其源码如下:
public class Singleton {
public static volatile Singleton singleton;
/**
* 构造函数私有,禁止外部实例化
*/
private Singleton() {};
public static Singleton getIns