【对于单例模式双重检查的一些理解】一、首先从形而上角度看,我认为很多文章都在把两个目标(我称为单例目标和安全目标)混在一起谈。注意这是两个目标,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)
文章图片
推荐阅读
- 数据结构|数组模拟队列
- 赠人玫瑰手留余香|C语言单目操作符++、- -的讲解
- C语言与C++编程|马斯克(我是 Rust 粉丝,但为了性能会选择 C语言)
- 笔记分享|C++学习笔记(B站黑马程序员C++教程)
- c++|【b站黑马程序员C++视频学习笔记-继承的基本语法】
- c++|C++实现之单链表中删除指定值
- 单片机stm32|学习单片机切记这四点要求,少走弯路
- 业界资讯|TIOBE 5 月编程语言排行榜(C# 最受开发者欢迎,C++ 将冲击 Top 3)
- leetcode|力扣刷题 16.合并两个有序数组——简单题