• [ ] 为什么不加volatile的DCL会有问题

    为什么不加volatile的DCL有问题

    主要是线程A抢到锁后,new对象的操作指令被分成了3个步骤。

      1. 分配对象内存
      1. 初始化对象值
      1. 将对象内存赋值给引用对象

若第2步和第3步重排序后。此时顺序是 1 3 2。线程A做完了步骤3。但是没有做步骤2。此时线程B进来判断不为null,取这个实例并使用,但是此时 实例并没有被初始化里面的值。
image.png

这里不触犯任何的happens-before规则。 且由于这三步的重排序并不影响结果,所以JMM也是允许此等操作的

为啥加volatile就可以了呢?

volatile的变量的写操作后面要插入 StoreLoad屏障。
B线程对实例的读操作一定是对象写之后执行。