- 1
- 0
- 约2.49千字
- 约 8页
- 2017-06-02 发布于河南
- 举报
细说Singleton模式2
细说Singleton模式 创建、多线程与销毁 二
2.多线程
在解一中,如果我们运行在多线程的环境中,该方案是完美的么,将会有什么后果呢?
后果就是会造成内存泄漏,并且有可能前后获取的Singleton对象不一样(原因请自己思考,后面有解答)。
为了解决这个问题,将解一的Instance改为如下:
38.Singleton Singleton::Instance(){
39.Lock(m_mutex); //含义为获取互斥量 //1
40.If( !m_pInstance ){ //2
41.m_pInstance = new Singleton; //3
42.}
43.UnLock(m_mutex); //4
44.return *m_pInstance; //5
45.}
46.
此种方法将解决解一运行在多线程环境下内存泄漏的问题,但带来的结果是,当m_mutex被锁定时,其它试图锁定m_mutex的线程都将必须等等。并且每次执行锁操作其付出的代价极大,亦即是这种方案的解决办法并不吸引人。
那么我们将上面的代码改为如下方式:
47.Singleton Singleton::Instance(){
48.If( !m_pInstance ){ //1
49.Lock(m_mutex); //含义为获取互斥量 //2
50.m_pInstance = new Singleton; //3
51.UnLock(m_mutex); //4
52.}
53.return *m_pInstance; //5
54.}
55.
这样修改的结果没有问题了么?NO!!!!该方案带来的结果同解一,原因也一样,都将造成内存泄漏。此时“双检测锁定”模式就粉墨登场了。
由Doug Schmidt和Tim Harrison提出了“双检测锁定”(Double-Checked Locking)模式来解决multithread singletons问题。
56.Singleton Singleton::Instance(){
57.If( !m_pInstance ){ //1
58.Lock(m_mutex); //含义为获取互斥量 //2
59.If(!m_pInstance) //3
60.m_pInstance = new Singleton; //4
61.UnLock(m_mutex); //5
62.}
63.return *m_pInstance; //6
64.}
请看上面的第三句,这句话是不是具有化腐朽为神奇的力量啊 ^_^
上面的方案就完美了么。回答还是NO!!!(各位看官是否已经郁闷了啊,这不是玩我啊?请耐心点,听我细细到来^_^)
如果在RISC机器上编译器有可能将上面的代码优化,在锁定m_mutex前执行第3句。这是完全有可能的,因为第一句和第3句一样,根据代码优化原则是可以这样处理的。这样一来,我们引以为自豪的“双检测锁定”居然没有起作用( L)
怎么办?解决呗。怎么解决?简单,我们在m_pInstance前面加一个修饰符就可以了。什么修饰符呢?……
àvolatile(简单吧)
那么我们完整的解法如下:
65./*解三*/
66.class Singleton
67.{
68.public:
69.static Singleton Instance(){ //1
70.if( !m_pInstatnce){ //2
71.Lock(m_mutex) //3
72.If( !m_pInstance ) //4
73.m_pInstance = new Singleton;//5
74.UnLock(m_mutex); //
您可能关注的文档
- 第三章 常用公式及数据表.doc
- 第三章 热处理浴炉.ppt
- 第三章 汇编语言程序设计2.ppt
- 第三章 草图7.pdf
- 第三章 第二节 发生在肺内的气体交换(二).ppt
- 第三章 第二节 发生在肺内的气体交换(一).ppt
- 第三章_古罗马时期的教育.ppt
- 第三章《整式的加减》单元检测.doc
- 第三章功和能1.ppt
- 第三章_人体的呼吸(2课时).ppt
- 全过程工程管理造价咨询工程监理项目服务方案投标方案(技术部分).doc
- 招标代理服务投标技术服务方案(技术方案).doc
- AI大模型与AIGC技术在公安领域的应用解决方案(99页 PPT).pptx
- 工业4.0智能制造数字工厂规划方案.pptx
- 树立社会主义核心价值观.docx
- 三年(2023-2025)中考历史真题分类汇编(全国)专题21 科技文化与社会生活(解析版).docx
- 2025年中考道德与法治真题完全解读(吉林卷).pdf
- 2025年中考道德与法治真题完全解读(安徽卷).pdf
- 三年(2023-2025)中考历史真题分类汇编(全国)专题14 人民解放战争(解析版).pdf
- 三年(2023-2025)广东中考历史真题分类汇编:专题03 中国近代史(八年级上册)(解析版).docx
最近下载
- 期末专题复习书面表达满分范文必背10篇人教版英语八年级上册(1).docx VIP
- 2026天津市津南创腾经济开发有限公司招聘8人考试笔试参考题库及答案解析.docx VIP
- 四川省成都市双流区2024-2025学年八年级上学期期末历史试题(含答案).docx VIP
- 1岗位操作指南-管家V2.0(A4版)修订稿.pdf VIP
- 山东省菏泽市2024-2025学年高一上学期期末考试语文试题.pdf VIP
- 痤疮护理 ppt课件资料讲解.ppt VIP
- 服装品类商业计划书.pptx VIP
- (正式版)DB15∕T 3202-2023 《高纬度多年冻土区公路工程地质勘察技术规范》.docx VIP
- 160个风机特性曲线.docx VIP
- 月考试卷Unit3-4(试题)人教PEP版英语六年级上册.docx VIP
原创力文档

文档评论(0)