对于单例模式双重检查的一些理解

【对于单例模式双重检查的一些理解】一、首先从形而上角度看,我认为很多文章都在把两个目标(我称为单例目标和安全目标)混在一起谈。注意这是两个目标,1是是否单例;2是在多线程下是否可靠。双重锁只是保证了目标1,与目标2无关。其实你想一下,1个if解决不了目标2,2个if就行了?那3个if岂不效果更好?
二、具体来看。有人说1if为效率(避免都申请锁)【我认为不准确】;2if为避免重复new。
(1)首先,双重检查锁不一定非用到单例问题上。用到别处(2中也未必是做new工作),可能1,2都为效率。
(2)就单例问题而言,1if本来就是单例模式要求的,谈不上什么效率,2if才是增加的,能避免重复new,从而在多线程环境下没破坏“目标1”。
(3)至于目标2,问题出在p==null为假时。p不空,不代表你马上使用就没问题(因为编译重排、硬件等各种原因,对象还没有初始化好就被你看到了) 。这一点对1if,2if都适用,所以你就是加3个if,或者加volatile,也还是未必能保证你看到的、不空的p能用(前提是p是刚new的,只要是new的问题,那影响因素太多了:单例内部还有其他数据成员是否准备好、编译优化、OS、多CPU调度、CPU内部。。。)
(4)所以我觉得双重锁,只要是用在单例问题上,从根本上看是有安全问题的,只是在你某个具体平台上好使而已。
![3Y(LCJ2]T`SQN76BC29K8}U.png](/img/bVcZFTm)对于单例模式双重检查的一些理解
文章图片

    推荐阅读