一、首先从形而上角度看,我认为很多文章都在把两个指标(我称为单例指标和平安指标)混在一起谈。留神这是两个指标,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)