直接看代码:

/*
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版本号的更多相关文章

  1. 单例设计模式Singleton之懒加载模式(懒汉模式)【原】

    单例设计模式Singleton之懒加载模式(懒汉模式) SingletonLazy.java类 package kingtool; import kingtool.http.IPTool; publi ...

  2. 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,这种形 ...

  3. 懒人模式开启Android模块自动化Api之旅

    推荐阅读: 滴滴Booster移动App质量优化框架-学习之旅 一 Android 模块Api化演练 不一样视角的Glide剖析(一) 在将业务进行模块化时,避免不了模块页面路由和模块通信, 大多数我 ...

  4. 面试:用 Java 实现一个 Singleton 模式

    面试:用 Java 实现一个 Singleton 模式 面试系列更新后,终于迎来了我们的第一期,我们也将贴近<剑指 Offer>的题目给大家带来 Java 的讲解,个人还是非常推荐< ...

  5. C++ Singleton模式

    地址:http://www.cppblog.com/dyj057/archive/2005/09/20/346.html Singleton模式是常用的设计模式之一,但是要实现一个真正实用的设计模式却 ...

  6. Objective-C的singleton模式

    最近因为在ios应用开发中,考虑到一些公共方法的封装使用,就决定使用单例模式的写法了..不知道,Object-c中的单例模式的写法是否和java中的写法是否有所区别?于是阿堂从网上一搜,发现“ Obj ...

  7. 设计模式之Singleton模式和Strategy模式是什么

    Singleton模式 单例模式,也交单子模式,有时候系统只需要拥有一个全局对象. 这种模式涉及到一个单一的类,该类负责创建自己的对象,同时确保只有单个对象被创建.这个类提供了一种访问其唯一的对象的方 ...

  8. 人工智能——Singleton模式

    上次在状态模式中的设计有一个严重的问题,就是如下: voidCTroll::ChageState(CState* pNewState) {        deletem_pCurrentState; ...

  9. C++完美实现Singleton模式[转]

    Singleton模式是常用的设计模式之一,但是要实现一个真正实用的设计模式却也不是件容易的事情.1. 标准的实现class Singleton{public: static Singleton * ...

随机推荐

  1. Swift 可展开可收缩的表视图

    主要学习与运行效果 在本节的内容中,我们将通过一个具体实例的实现过程,详细讲解在表视图当中,如何创建一个可展开可收缩的表视图.为了让读者有着更为直观的印象,我们将通过模仿QQ好友列表来实现这个效果. ...

  2. HttpClient使用详解

    http://itindex.net/detail/52566-httpclient HttpClient使用详解 标签: httpclient | 发表时间:2015-01-22 12:07 | 作 ...

  3. shell 调试

    感觉编写shell在查找错误的过程中,很让你崩溃,还好shell也提供了一些调试的方式: 语法检查      -n选项做语法检查,而不执行脚本      sh -n script_name.sh 启动 ...

  4. 灵动标签的使用方法 ecms通过运行sql获取须要的记录

    在某些条件下,我们要求站点的某页上显示指定的信息, 可是这样的指定假设固定去用代码写死的话,对以后的修改将会是大麻烦: 这时候sql语句的优势就凸显出来,利用sql语句仅仅须要改改数字,就能让显示的内 ...

  5. 【Access2007】将Excel表导入到Access2007在现有的表成

    将Excel表导入到Access2007,你会发现邪恶Access2007这将帮助你自己主动创建表.您是否想插入完全没问你到一个现有的表. 然后,我们需要解决这个问题: 一.常的步骤先将Excel表导 ...

  6. ps中图层混合模式、多图层叠加、不透明度、填充、图层样式详解

    图像领域中,通过进行一下想法的时候,都要通过用ps看下是不是合理,而ps中图层是必用的一个功能,下面详解一下图层有关的叠加原理. 基本顺序是图层从下往上继续, 先计算图层的填充,再计算样式.最后计算不 ...

  7. ZXing拍摄代码扫描之后以区分一维码、二维码、其他代码

    我怎么有二维码没有联系,最近遇到一个问题,,如何推断条码扫描到一维代码或者二维代码,辛苦了一个下午下班后自己,加上网上跟踪信息. 总结出两种方式能够解决该问题(推荐採用另外一种方式): 1.改动源代码 ...

  8. STL__queue_的应用

    转:http://hi.baidu.com/xiaotiandm/item/bda34511cf9e99098fbde41a 调用的时候要有头文件: #include<stdlib.h> ...

  9. XML实例文档

    from: http://www.w3school.com.cn/xpath/xpath_examples.asp XML实例文档 我们将在下面的例子中使用这个 XML 文档: "books ...

  10. 每日一小练——高速Fibonacci数算法

    上得厅堂,下得厨房,写得代码,翻得围墙,欢迎来到睿不可挡的每日一小练! 题目:高速Fibonacci数算法 内容:先说说Fibonacci数列,它的定义是数列:f1,f2....fn有例如以下规律: ...