我正在阅读 this article关于“双重检查锁定”和文章的主要主题,我想知道为什么在文章的某些地方作者使用下一个成语:
Listing 7. Attempting to solve the out-of-order write problem
public static Singleton getInstance() { if (instance == null) { synchronized(Singleton.class) { //1 Singleton inst = instance; //2 if (inst == null) { synchronized(Singleton.class) { //3 inst = new Singleton(); //4 } instance = inst; //5 } } } return instance; }
我的问题是: 有什么理由用同一个锁同步两次某些代码吗? 这样做有什么目的吗?
非常感谢。
最佳答案
锁定两次的目的是尝试防止乱序写入。内存模型指定重新排序可以发生的位置,部分是根据锁。该锁确保在“instance = inst;”之后不会出现任何写入(包括单例构造函数中的任何写入)。行。
但是,为了更深入地探讨这个主题,我建议 Bill Pugh's article .然后永远不要尝试 :)
关于java - 双重检查锁定文章,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/157198/