单例模式
- 背景
- 对象半初始化
- 对象在创建时,先在堆分配内存空间,这时对象为默认值,此时为半初始化状态
- 执行对象的构造方法后,对象完成初始化
- 指令重排序
- 为提高程序执行效率,在程序执行前,编译器/处理器对指令进行重新排序
- 对象半初始化
- 造成问题
- 多线程情况下
- 指令重排序导致对象的赋值在对象构造方法前执行
- 线程可能取到半初始化的对象
- 解决方法
- 给变量添加 volatile 关键字
- 确保变量的可见性
- 防止指令重排序
- 给变量添加 volatile 关键字
- Double Check Lock (DCL)
- 结构:空验证 + 同步锁 + 空验证
- 保证多线程场景下的,单例对象创建的线程安全
Simple is Awesome