为什么不加volatile的DCL有问题为啥加volatile就可以了呢? [ ] 为什么不加volatile的DCL会有问题 为什么不加volatile的DCL有问题主要是线程A抢到锁后,new对象的操作指令被分成了3个步骤。 分配对象内存 初始化对象值 将对象内存赋值给引用对象 若第2步和第3步重排序后。此时顺序是 1 3 2。线程A做完了步骤3。但是没有做步骤2。此时线程B进来判断不为null,取这个实例并使用,但是此时 实例并没有被初始化里面的值。 这里不触犯任何的happens-before规则。 且由于这三步的重排序并不影响结果,所以JMM也是允许此等操作的 为啥加volatile就可以了呢?volatile的变量的写操作后面要插入 StoreLoad屏障。B线程对实例的读操作一定是对象写之后执行。