首页 > 技术文章 > java 双重校验性volatile

guyuedashu 2019-12-24 18:54 原文

A a = new A();
上述可拆分为三个步骤:
-1、分配地址
-2、初始化对象
-3、将 变量a 指向这个地址

在准时制生产方式(Just In Time简称JIT)时,可能发生指令重排;

在单线程时,就算发生了重排,也不会有问题,在多线程时,2、3步骤发生改变,
线程一,执行了1,3,2的顺序,当赋值操作执行后,线程二刚好 判断不为null直接返回,但其实,对象还没有初始化完成。机会发生错误

volatile 可以保证数据的可见性和不妨生指令重排,但不能保证原子性,

volatile 解读
https://www.cnblogs.com/Mainz/p/3556430.html#

推荐阅读