java - 双重检查锁定文章

标签 java synchronization locking double-checked-locking

我正在阅读 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/

相关文章:

c++ - 停止我的应用程序的两个实例同时写入同一个文件夹

postgresql - 更新子行锁定 PostgreSQL 中的父行(外键,9.1)

java流比较列表与局部变量

java - 在 Android 中从服务器播放 mp4 视频时出错

java - 处理一次获取两个相邻元素的集合(使用流)

Silverlight HttpWebRequest 同步调用

Linux 分布式锁管理器

java:替换 url 中最后 2 个斜杠之间的字符串/

objective-c - 如何避免 @synchronized(self) 上的死锁?

amazon-web-services - awscli s3 同步通配符