interviewGuide icon indicating copy to clipboard operation
interviewGuide copied to clipboard

单例模式里面第一版DCL代码中的注释不太对

Open dooonabe opened this issue 5 years ago • 3 comments

public class Singleton {               
    private static Singleton instance;              
    public static Singleton getInstance() {              
        if (instance == null) {                        
            synchronized (Singleton.class) { 
                if (instance == null) { //双重检查存在的一样在于可能会有多个线程进入第一个判断,然后竞争同步锁,线程A得到了同步锁,创建了一个Singleton实例,赋值给instance,然后释放同步锁,此时线程B获得同步锁,又会创建一个Singleton实例,造成初始化覆盖。                
                    instance = new Singleton();        
                }
            }                                   
        }                                      
        return instance;                        
    }                                                 
}                  

被synchronized修饰的语句块有Happens-Before规则,线程B在线程A之后进入同步块一定可以看到instance!=null

dooonabe avatar May 02 '20 06:05 dooonabe

对啊,所以才需要双重检查

ziping95 avatar May 04 '20 09:05 ziping95

对啊,所以才需要双重检查

‘ 双重检查存在的一样在于可能会有多个线程进入第一个判断,然后竞争同步锁,线程A得到了同步锁,创建了一个Singleton实例,赋值给instance,然后释放同步锁,此时线程B获得同步锁,又会创建一个Singleton实例,造成初始化覆盖。 ’ 这句注释不对。

dooonabe avatar May 05 '20 02:05 dooonabe

我的注释:双重检查存在的一样在于可能会有多个线程进入第一个判断,然后竞争同步锁,线程A得到了同步锁,创建了一个Singleton实例,赋值给instance,然后释放同步锁,此时线程B获得同步锁,又会创建一个Singleton实例,造成初始化覆盖。

你的回复:被synchronized修饰的语句块有Happens-Before规则,线程B在线程A之后进入同步块一定可以看到instance!=null

我觉得注释是没有错的,你说的线程B可以看到instance!=null不代表就线程B不会再执行

instance = new Singleton();

方法了,所以为了避免线程B再次执行一次初始化,所以synchronized修饰的语句块再加了一个if判断,你觉得有问题我们可以继续探讨,项目主页有技术群的二维码和我的微信

NotFound9 avatar May 07 '20 02:05 NotFound9