1. #include <iostream>
  2. #include <windows.h>
  3. #include <mutex>
  4. std::mutex gmutex;
  5. using namespace std;
  6. template<typename Type>
  7. class Singleton
  8. {
  9. public:
  10. static Type* GetSingleton()
  11. {
  12. if (siglen == NULL)
  13. {
  14. unique_lock<std::mutex> lock(gmutex);//C++11加锁。
  15. if (siglen == NULL)
  16. {
  17. siglen = new Type();
  18. Type *temp = new Type();
  19. MemoryBarrier();
  20. siglen = temp;
  21. }
  22. }
  23. return siglen;
  24. }
  25. private:
  26. static Type* siglen;
  27. };
  28. template<typename Type>
  29. Type* Singleton<Type>::siglen = NULL;
  30. class Text
  31. {
  32. public:
  33. Text()
  34. {
  35. data = 100;
  36. //由于是单例模式。所以唯一会出现申请内存。调用构造
  37. //函数。赋值三个步骤混乱的机会仅仅有在前面的1-2次
  38. //的时候。可惜速度太快了。这样的情况发生的概率及其低
  39. //,可是我们的心理要始终明确。
  40. }
  41. void Printf()
  42. {
  43. cout << "data="<<data << endl;
  44. }
  45. static DWORD WINAPI ThreadFunc(LPVOID arg)
  46. {
  47. Singleton<Text>::GetSingleton()->Printf();
  48. return DWORD(0);
  49. }
  50. private:
  51. int data;
  52. };
  53. int main()
  54. {
  55. HANDLE hThread;
  56. DWORD threadId;
  57. for (int i = 0; i < 10; i++)
  58. {
  59. hThread = CreateThread(NULL, 0, &(Text::ThreadFunc), (void *)"123",0, &threadId);
  60. }
  61. Sleep(5);
  62. cout << "ThreadFunc is running!!!" << endl;
  63. return 0;
  64. }
  65. #include <iostream>
  66. using namespace std;
  67. //引用计数的智能指针。
  68. template<typename Type>
  69. class my_auto_ptr
  70. {
  71. public:
  72. my_auto_ptr(Type* p = NULL) :ptr(p)
  73. {
  74. count = new int[1];
  75. count[0] = 1;
  76. }
  77. my_auto_ptr(const my_auto_ptr &ma)
  78. {
  79. count = ma.count;
  80. count[0]++;
  81. }
  82. my_auto_ptr& operator=(const my_auto_ptr &ma)
  83. {
  84. if (this != &ma)
  85. {
  86. this->~my_auto_ptr();
  87. count = ma.count;
  88. count[0]++;
  89. ptr = ma.ptr;
  90. }
  91. return *this;
  92. }
  93. ~my_auto_ptr()
  94. {
  95. if (count!=NULL &&count[0]-- == 1)
  96. {
  97. cout << "~my_auto_ptr()" << endl;
  98. delete ptr;
  99. ptr = NULL;
  100. delete[] count;
  101. count = NULL;
  102. }
  103. }
  104. Type* operator->()
  105. {
  106. return ptr;
  107. }
  108. Type& operator*()
  109. {
  110. return *ptr;
  111. }
  112. private:
  113. Type *ptr;
  114. int *count;
  115. };
  116. int main()
  117. {
  118. my_auto_ptr<int> ps(new int(100));
  119. my_auto_ptr<int> pb(ps);
  120. my_auto_ptr<int> pd;
  121. pd = pb;
  122. return 0;
  123. }

C++再论单例模式的更多相关文章

  1. 05-IOSCore - 单例模式、KVO

    单例模式 是设计模式之一,使用频率高,让数据或对象在程序的各个地方都能访问,保持唯一 要素: 各个地方都能访问方法 + 静态消息 只要导入类 就能访问 保持唯一 1.在静态消息内限制对象的创建 2.外 ...

  2. DCL单例模式

    我们第一次写的单例模式是下面这样的: public class Singleton { private static Singleton instance = null; public static ...

  3. Java项目(5)——单例模式的应用与研究

    单例模式是非常别致的一个模式,非常少有人拿它跟其它模式相比,由于,单例模式非常easy,非常特别,作用就是保证一个类有唯一一个实例,并让一个全局变量使得它能被訪问.而保证这个类仅仅被实例化一次的办法就 ...

  4. Spring框架学习一

    Spring框架学习,转自http://blog.csdn.net/lishuangzhe7047/article/details/20740209 Spring框架学习(一) 1.什么是Spring ...

  5. Spring------概述

    Spring框架------概述: spring是j2ee应用程序框架,是轻量级的IOC和AOP的容器框架,主要是针对JAVABean的生命周期进行管理的轻量级容器,可以单独使用,也可以和Struts ...

  6. Android Context完全解析

    Context类型 我们知道,Android应用都是使用Java语言来编写的,那么大家可以思考一下,一个Android程序和一个Java程序,他们最大的区别在哪里?划分界限又是什么呢?其实简单点分析, ...

  7. Android各种获取Context方法

    首先讲一讲这四个函数的区别,后面还有我对context的一些理解区别如下所示: 原文链接http://stackoverflow.com/questions/6854265/getapplicatio ...

  8. Java实战之03Spring-01Spring概述

    一.Spring概述 1.Spring是什么? Spring是分层的Java SE/EE应用 full-stack轻量级开源框架,以IoC(Inverse Of Control:反转控制)和AOP(A ...

  9. spring框架的一些技术总结

    纵观现在互联网行业,java的地位依然不可动摇,因为java拥有着的众多开发人员和适用性广,技术与解决技术大部分开源等特点,因此java依然是众多众多开发行业作为互联网开发的首选,而说到开发,我们就不 ...

随机推荐

  1. as eclipse 对比

    eclipse目录结构 src:存放prj源码 gen:自动生成文件,R类存放资源文件的唯一id android+版本:项目jar包 assets:res存放资源文件,不会被gen生成资源id,同过a ...

  2. Hive元数据启动失败

    Caused by: java.net.ConnectException: Connection refused (Connection refused) at java.net.PlainSocke ...

  3. Matplotlib基本图形之饼状图

    Matplotlib基本图形之饼状图 饼状图特点: 饼状图显示一个数据系列中各项大小与各项总和的比例饼状图的数据点显示为整个饼状图的百分比 示例代码 import os import time imp ...

  4. spring常用的注解

    一.使用注解之前要开启自动扫描功能,其中base-package为需要扫描的包(含子包). <context:component-scan base-package="cn.test& ...

  5. centos 修改时间 计划任务

    centos 修改时间 计划任务 一,系统时间修改   1 远程连接到centos 或者直接登录系统 #date 查看系统时间 如下图所示 2 #date -s 修改时间 看下面的例子#date -s ...

  6. C#中类的实例是不能 获取到类中的静态方法和静态变量(Static)的,及原因

    类中的静态方法和变量是共享的.只能用类名去调用.

  7. LINUX DNS客户端 解析域名慢的问题。

    Linux系统下域名解析的配置文件是/etc/resolv.conf cat /etc/resolv.conf # Generated by NetworkManager options single ...

  8. PAT天梯赛练习题——L3-007. 天梯地图(多边权SPFA)

    L3-007. 天梯地图 时间限制 300 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 陈越 本题要求你实现一个天梯赛专属在线地图,队员输入自己学校 ...

  9. Oracle学习笔记整理手册

    文章目录(1)Oracle正则匹配使用(2)Oracle修改有数据的数据字段类型(3)Oracle表数据回滚语句(4)sql筛选出记录数大于2的记录(5)oracle同义词(6)oracle内外连接( ...

  10. [luoguP3953] 逛公园(DP + spfa)

    传送门 看到求方案数,应该很容易想到dp f[u][i]表示到点u,且比到u的最短距离多i的方案数 那么需要先预处理dis数组,spfa或者堆优化的dijk 因为考虑到dp的顺序,f[u][i]转移到 ...