人们说volatile由于内存屏障很好而在两次检查锁中使用了volatile,但随后我们也进行了同步处理,这说在指令重新排序过程中什么都不会从该块中发出,因此出现了一个问题,为什么使用volatile会因为使用了同步然后必须完成构造器调用,这样才能避免部分构造对象。 如果说CPU缓存是问题所在,那就是为什么使用volatile的原因,那么就不要使用同步了,因为那样会使线程变得不一致。
易失性用作双重检查锁定中的内存屏障。 Why is volatile used in this example of double checked locking是所引用的问题。但这尚不清楚同步如何无法创建完整的对象。
在同步块中发生指令重新排序,但是从同步块中什么也没有发生。 Does synchronized keyword prevent reordering in Java?是参考,因此在双重检查锁定中无需使用volatile。
我在Google上搜索了很多,但找不到任何答案,如果我的理解存在差距,请帮忙。