懒人模式Singleton模式Meyers版本号
直接看代码:
/*
Singleton模式保证:在一个程序,,一个类有且只有一个实例。并提供一个访问
它的全局访问点 在编程其中。很多情况下,需要确保有一类的一个实例
比如: windopws系统中仅仅能有一个窗体管理器
某个程序中仅仅能有一个日志输出系统
一个GUI系统类库中,有且仅仅有一个ImageManager
*/ #include <iostream>
#include <windows.h>
#include <process.h>
using namespace std;
//Meyers Singleton Pattern实现 class CSingleton2
{
public:
//单例对象使用局部静态变量方式从而使之延迟到调用的时候实例化
static CSingleton2& GetInstance()
{
static CSingleton2 sg;
return sg; }
void Print()
{
printf("print Singleton2 count = %d\n",m_count);
} private:
int m_count;
//构造函数私有化。让外部不能訪问,达到仅仅能有一个实例对象的效果
CSingleton2()
{
printf("開始 construct Singleton2 count = %d\n",m_count);
::Sleep(1000);//这里是为了看到效果
m_count = 100;
printf("结束 construct Singleton2 count = %d\n",m_count);
}
public:
~CSingleton2()
{
printf("调用析构函数\n");
} private:
//防止拷贝构造和赋值操作
CSingleton2(const CSingleton2&);
CSingleton2& operator=(const CSingleton2&);
}; unsigned int __stdcall thread(void*)
{
printf("current Thread ID = %d\n", ::GetCurrentThreadId());
CSingleton2::GetInstance().Print(); return 0;
} void TestMultThread()
{
//这里创建三个线程
for(int i = 0; i < 3; i++)
{
HANDLE t = (HANDLE)::_beginthreadex(NULL,0,thread,NULL,0,NULL);
::CloseHandle((HANDLE)t);
} } int main()
{ TestMultThread();
getchar();
return 0; } /*
1:长处:
1):该实现是一个“懒汉”单例模式,意味着仅仅有在第一次调用GetInstance()的时候才会实例化
2):不须要每次调用GetInstance()静态方法时,必须推断NULL==m_instance。效率相对高一点
3):使用对象而不是指针分配内存,因此自己主动调用析构函数,不会导致内存泄露
4):在多线程下的确可以保证有且仅仅有一个实例产生。 2:缺点: 在多线程情况下,并非真正的线程安全 */ /* current Thread ID = 1148
開始 construct Singleton2 count = 0 --- 如果1148线程创建单件实例。分配内存。可是还未初始化实例的成员变量
current Thread ID = 6668
print Singleton2 count = 0
current Thread ID = 6892
print Singleton2 count = 0 -- 线程6668拿到全部权,此时Singleton2内存已经分配好了,可是成员变量还没初始化。所以调用Print,m_count = 0;
结束 construct Singleton2 count = 100 -- 6892拿到线程全部权,继续进行成员变量的初始化。然后调用Print函数,输出100;
print Singleton2 count = 100 调用析构函数 -- 一次析构函数,说明生成了一个实例对象
Press any key to continue 原因:
这是由于C++构造函数并非线程安全的。
C++中的构造函数简单来说分两步:
第一步:内存分配
第二步:初始化成员变量
因为多线程的关系,可能当我们在分配内存好了以后,还没来得急初始化成员变量,就
进行线程切换,另外一个线程拿到全部权后,因为内存已经分配好了,可是变量初始化
还没进行,因此打印成员变量的相关值会发生不一致现象。 结论:Meyers 方式尽管能确保罗产生多个线程的唯一实例。但不能确保成员变量的值是正确的。
*/
版权声明:本文博主原创文章。博客,未经同意不得转载。
懒人模式Singleton模式Meyers版本号的更多相关文章
- 单例设计模式Singleton之懒加载模式(懒汉模式)【原】
单例设计模式Singleton之懒加载模式(懒汉模式) SingletonLazy.java类 package kingtool; import kingtool.http.IPTool; publi ...
- C# 嵌入dll 动软代码生成器基础使用 系统缓存全解析 .NET开发中的事务处理大比拼 C#之数据类型学习 【基于EF Core的Code First模式的DotNetCore快速开发框架】完成对DB First代码生成的支持 基于EF Core的Code First模式的DotNetCore快速开发框架 【懒人有道】在asp.net core中实现程序集注入
C# 嵌入dll 在很多时候我们在生成C#exe文件时,如果在工程里调用了dll文件时,那么如果不加以处理的话在生成的exe文件运行时需要连同这个dll一起转移,相比于一个单独干净的exe,这种形 ...
- 懒人模式开启Android模块自动化Api之旅
推荐阅读: 滴滴Booster移动App质量优化框架-学习之旅 一 Android 模块Api化演练 不一样视角的Glide剖析(一) 在将业务进行模块化时,避免不了模块页面路由和模块通信, 大多数我 ...
- 面试:用 Java 实现一个 Singleton 模式
面试:用 Java 实现一个 Singleton 模式 面试系列更新后,终于迎来了我们的第一期,我们也将贴近<剑指 Offer>的题目给大家带来 Java 的讲解,个人还是非常推荐< ...
- C++ Singleton模式
地址:http://www.cppblog.com/dyj057/archive/2005/09/20/346.html Singleton模式是常用的设计模式之一,但是要实现一个真正实用的设计模式却 ...
- Objective-C的singleton模式
最近因为在ios应用开发中,考虑到一些公共方法的封装使用,就决定使用单例模式的写法了..不知道,Object-c中的单例模式的写法是否和java中的写法是否有所区别?于是阿堂从网上一搜,发现“ Obj ...
- 设计模式之Singleton模式和Strategy模式是什么
Singleton模式 单例模式,也交单子模式,有时候系统只需要拥有一个全局对象. 这种模式涉及到一个单一的类,该类负责创建自己的对象,同时确保只有单个对象被创建.这个类提供了一种访问其唯一的对象的方 ...
- 人工智能——Singleton模式
上次在状态模式中的设计有一个严重的问题,就是如下: voidCTroll::ChageState(CState* pNewState) { deletem_pCurrentState; ...
- C++完美实现Singleton模式[转]
Singleton模式是常用的设计模式之一,但是要实现一个真正实用的设计模式却也不是件容易的事情.1. 标准的实现class Singleton{public: static Singleton * ...
随机推荐
- 如何利用Win32API取得另一支程式中的ListView內的所有值(RegisterHotKey,ReadProcessMemory,WindowFromPoint和VirtualAllocEx)
http://blog.csdn.net/shuaihj/article/details/6129506
- Java模拟POST表单提交HttpClient操作
public static void Login() { String url = "http://www.***.com/login"; PostMethod postMetho ...
- ThinkPHP分页使用例子(二十一)
原文:ThinkPHP分页使用例子(二十一) ThinkPHP分页使用 PHP代码: public function fenye(){ $User = M('Leyangjun'); // 实例化Us ...
- [Android学习笔记]自定义控件的使用
自定义控件时,最好抽象得彻底,并且编写需严谨,因为可能程序中多处都会引用到它,或者提供给团队中的其他人使用. 其一般步骤为: 1.创建控件的类文件,定义其功能逻辑.一般继承自现有控件或者View2.在 ...
- Windbg的gflags.exe -- Attach调试利器
有没有碰到过程序启动就因为异常直接crash?有没有碰到程序启动之后什么反应也没有?有没有碰到过程序启动之后去触发另一个进程失败?有没有碰到别人的程序调用了你的代码,出现问题以后,让你来调查,而你只有 ...
- 上mongodb创建一些吸取的经验教训指数
想来接触mongodb它已经快一年了,对于其指数已经积累了很多的经验,知识,以这个夜黑风高的优势,放mongodb总结一番吧. 一,索引介绍 mongodb具有两类索引,分别为单键索引和复合索引. 1 ...
- 浅谈 Python 程序和 C 程序的整合
源地址:http://www.ibm.com/developerworks/cn/linux/l-cn-pythonandc/ 概览 Python 是一种用于快速开发软件的编程语言,它的语法比较简单, ...
- socket网络编程的一些基础知识
源地址:http://blog.csdn.net/roger_77/article/details/1453049 目录: 1) 什么是套接字? 2) Internet 套接字的两种类型 3) 网络理 ...
- HLG 2163 方格取数 (最大网络流)
题目链接: m=ProblemSet&a=showProblem&problem_id=2163">点击打开链接 Description : 给你一个n*n的格子的棋 ...
- TextKit学习(四)通过boundingRectWithSize:options:attributes:context:计算文本尺寸
之前用Text Kit写Reader的时候,在分页时要计算一段文本的尺寸大小,之前使用了NSString类的sizeWithFont:constrainedToSize:lineBreakMode:方 ...