懒人模式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 * ...
随机推荐
- PHP中抽象类与接口的应用场景
<?php /*** ====笔记部分==== 接口的具体语法: 0:以人类为, class Human 是人的草图 而接口 是零件 可以用多种零件组合出一种新特种来. 1: 如上,接口本身即是 ...
- xp下Oracle数据库导入SQLServer数据库数据
Oracle数据库利用ODBC数据源.PLSQL Developer导入SQLServer数据库数据 操作: 建立数据源:控制面板→管理工具→数据源 (ODBC) 打开,界面如下: 点击添加,界面如下 ...
- VC调试篇
难怪很多前辈说调试是一个程序员最基本的技能,其重要性甚至超过学习一门语言.不会调试的程序员就意味着他即使会一门语言,却不能编制出任何好的软件. 我以前接触的程序大多是有比较成形的思路和方法,调试起来出 ...
- RBAC用户角色权限设计方案
RBAC(Role-Based Access Control,基于角色的访问控制),就是用户通过角色与权限进行关联.简单地说,一个用户拥有若干角色,每一个角色拥有若干权限.这样,就构造成“用 户-角色 ...
- jvm调优经验分享
当Java程序申请内存,超出VM可分配内纯的时候,VM首先可能会GC,假设GC完还是不够,或者申请的直接超够VM可能有的,就会抛出内 存溢出异常.从VM规范中我们能够得到,一下几种异常. java.l ...
- POJ 3414 Pots 记录路径的广搜
Description You are given two pots, having the volume of A and B liters respectively. The following ...
- 《sql---教学反馈系统-阶段项目2》
/* a) 创建数据库 使用T-SQL创建数据库feedback,要求:①一个主要文件(存放在第一个硬盘分区C:\project文件夹下),初始大小为10M,最大为200M,文件自动增长率为15% ② ...
- CString的部分实现剖析
一.CString初探: 在CString的实现中,其最基础的类结构如下: CString其实只有一个数据成员m_pszData,这个成员指向了字符串的首地址.但在MFC的具体实现中, m_pszDa ...
- (ZT)LoadRunner9.0成功破解方法
LoadRunner9.0软件下载地址: http://www.3atesting.com/filedown/LR9Download.exe 破解所需文件 http://download.csdn.n ...
- UVA 10828 - Back to Kernighan-Ritchie(概率+高斯消元)
UVA 10828 - Back to Kernighan-Ritchie 题目链接 题意:给图一个流程图,有结点的流程,每次进入下一个流程概率是均等的,有q次询问,求出每次询问结点的运行期望 思路: ...