DCL(Double Check) 单实例需不需要[volatile] 单例模式
技巧💡
- 简单来说,就是 Clss instance = new Clss();
有4个步骤。new对象,不存储指令重排情况。剩下3个步骤,是没有前后顺序要求的。可能存储重排情况。
一个是记录引用位置,
一个是将引用位置的内存初始化数据,
一个是将引用地址存到本地变量表中
当发生指令重排序时,其他线程就很有可能获取到对象,但是该对象还没有初始化,这个时候恰好我们需要使用到未初始化数据,则会报错。
可能发生指令重排,在第二个线程判断未空对象时,使用了半初始化状态的对象。 内存屏障,在读写内存时加额外操作