懒人模式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 * ...
随机推荐
- 九度OJ 1179 阶乘(模拟)
题目1179:阶乘 时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:4526 解决:1315 题目描写叙述: 输入n, 求y1=1!+3!+...m!(m是小于等于n的最大奇数) y2=2! ...
- SQL中如何将一个表中的某一列的数据复制到另一个表中的某一列里
表一: SPRD PRD_NO SPC 001 NULL 002 NULL 003 NULL ... ...
- Java原型模式之基础
一.是什么? 定义:用原型实例指定创建对象的种类,而且通过拷贝这些原型创建新的对象.(官方定义) 原型模式主要用于对象的复制,它的核心是就是类图中的原型类Prototype. Prototype类须要 ...
- 介绍linux下Source Insight强大代码编辑器sublime_text_3
背景 1 一. 运行环境 1 二.安装环境配置 1 三.创建快捷方式 1 四.配置全局环境 2 五.操作界面 3 背景 在windows操作系统系统下,文本代码编辑器众多,各路英雄豪杰争相写了许多强大 ...
- Bean-Query 一个把对象转换为Map的Java工具库
刚开源了一个经过完整測试的Java工具类. 地址例如以下: https://github.com/Jimmy-Shi/bean-query 使用说明例如以下: Bean-query Click Her ...
- Ubuntu 12.04更新源
源地址:http://www.cnblogs.com/eastson/archive/2012/08/24/2654163.html 1.首先备份Ubuntu12.04源列表 sudo cp /etc ...
- FZU2179(数位dp)
传送门:Chriswho 题意:求区间[1,n]内能整除自己本身各位数字的数的个数. 分析:这题跟CF 55D Beautiful numbers一样的,一个数能被它的所有非零数位整除,则能被它们的最 ...
- (1)cocos2d-x-2.2.4搭建windows开发环境
Cocos2d-x-2.2.4搭建windows环境 软件需求 Windows系统(windows7或之后的系统): cocos2d-x-2.2.4压缩包. python安装包(推荐使用2.7.3版本 ...
- Android 布局之LinearLayout 子控件weight权重的作用详析(转)
关于Android开发中的LinearLayout子控件权重android:layout_weigh参数的作用,网上关于其用法有两种截然相反说法: 说法一:值越大,重要性越高,所占用的空间越大: 说法 ...
- js封装好的模仿qq消息弹窗代码
在我们的日常开发中,或者生活中.常常须要用到弹出窗.这里我们就用js模拟一下qq消息一样的弹出窗. 直接贴代码: <!DOCTYPE html PUBLIC "-//W3C//DTD ...