转载

美团面试官问我-Java单例模式DCL双重检验锁为什么一定要加volatile,刚好我都会



对于 T t = new T();
其实有如下字节码指令完成

_new 'org/openjdk/jol/T'
dup
INVOKESPECIAL org/openjdk/jol/T.<init> ()V
astore 1
return

线程一 new 到一半时,m=0,发生重排序
这时线程 2 来了!看到 t 已经指向了一个半初始化的实例了!

这个概率很小,但是并发如淘宝,都是可能发生的!所以必须要加!

正文到此结束
本文目录