#pragma once
#include "stdafx.h"
#include<set>
#include<string>
#include<iostream>
using namespace std;/*
设计模式-单例模式(Singleton)保证一个类仅有一个实例,并提供一个访问它的全局访问节点。
[懒汉模式涉及多线程上锁问题,饿汉模式不涉及多线程上锁问题]
下面实现懒汉跟饿汉模式,先不考虑上锁问题,最后补充。
*/
/*
设计模式-迭代器模式(Iterator)
提供一种方法顺序访问一个聚合对象中的各个元素,而不暴露该对象内部表示。
(现在好多语言都已经内置实现了这个功能了,所以实际用途不大,
但是建议写一下,实现过程价值远远大于使用价值。)
*///懒汉模式
class Cwork {private:static Cwork *m_cWork;static int m_nMarkRunCount;Cwork() {}//注意,构造函数私有化可以限制其他人去实例化这个类。void DoWrite() {cout << "WorkCiunt:" << m_nMarkRunCount++ << endl;}
public:static void GetInstance() {if (m_cWork == NULL) {m_cWork = new Cwork();}}static void WrkteLog() {if (m_cWork == NULL) {cout << "no instance" << endl;return;}m_cWork->DoWrite();}
};Cwork * Cwork::m_cWork = NULL;
int Cwork::m_nMarkRunCount = 0;int main() {Cwork::WrkteLog();Cwork::GetInstance();Cwork::WrkteLog();getchar();return 0;
}

#pragma once
#include "stdafx.h"
#include<set>
#include<string>
#include<iostream>
using namespace std;//饿汉模式
class Cwork {private:static Cwork *m_cWork;static int m_nMarkRunCount;Cwork() {}//注意,构造函数私有化可以限制其他人去实例化这个类。void DoWrite() {cout << "WorkCiunt:" << m_nMarkRunCount++ << endl;}
public:static Cwork* GetInstance() {if (m_cWork == NULL) {m_cWork = new Cwork();}return m_cWork;}static void WrkteLog() {if (m_cWork == NULL) {cout << "no instance" << endl;return;}m_cWork->DoWrite();}
};Cwork * Cwork::m_cWork = Cwork::GetInstance();
int Cwork::m_nMarkRunCount = 0;int main() {Cwork::WrkteLog();Cwork::WrkteLog();getchar();return 0;
}

还有就是锁的问题。多线程环境下使用单例模式中的懒汉模式会涉及到上锁问题,主要是在这个地方:

上面是一个传统的上锁模式,但是这个会有一个资源浪费问题,就是虽然m_cWork已经不等于NULL了,但是还是会不停的上锁和解锁,上锁和解锁涉及到内核态和用户态的转换,这回导致资源浪费。于是便引出了双重锁的概念,双重锁全称双重检查锁定模式,缩写DCLP。

大体姿势是这样:

Static void GetInstance(){If(m_cWork == NULL){Lock{If(m_cWork == NULL){m_cWork = new CWork();}}}
}

但是继续延伸一下,根据这里(

https://blog.csdn.net/nodeathphoenix/article/details/51657973

)的分析:双重锁也是不饿稳定的,那篇文章里引入了volatile来解决问题,感兴趣的可以了解一下,我的思路是用汇编处理这个地方。不管用什么方式,注意一点,就是编译器会对我们的代码进行优化。也就是变换了很多姿势,最后转出来的汇编是一样的。这个地方要注意。

设计模式复习-单例模式相关推荐

  1. socket可以写成单例嘛_精读《设计模式 - Singleton 单例模式》

    Singleton(单例模式) Singleton(单例模式)属于创建型模式,提供一种对象获取方式,保证在一定范围内是唯一的. 意图:保证一个类仅有一个实例,并提供一个访问它的全局访问点. 其实单例模 ...

  2. 设计模式复习-抽象工厂模式

    设计模式复习-抽象工厂模式 有两种硬件,PC和Phone,有两种系统,Windows和Linux,现在假设PC和Phone上全都能安装这两个系统,并且将来硬件不会在变化,但是系统可能需要扩展,比如扩展 ...

  3. 设计模式复习-工厂方法模式

     设计模式复习-工厂方法模式 相对于简单工厂,工厂方法是把算法类的实例化延迟到了调用者那去做,调用者根据自己的需要,自己实例化相关的工厂并且生产相关算法.这么做是因为简单工厂是不满足OCP的,因为如果 ...

  4. C#设计模式(1)——单例模式

    原文地址:http://www.cnblogs.com/zhili/p/SingletonPatterm.html 一.引言 最近在设计模式的一些内容,主要的参考书籍是<Head First 设 ...

  5. java设计模式之单例模式(七种方法)

    单例模式:个人认为这个是最简单的一种设计模式,而且也是在我们开发中最常用的一个设计模式. 单例模式的意思就是只有一个实例.单例模式确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例.这个 ...

  6. java单例模式的七种写法_Java设计模式之单例模式的七种写法

    什么是单例模式? 单例模式是一种常见的设计模式,单例模式的写法有很多种,这里主要介绍三种: 懒汉式单例模式.饿汉式单例模式.登记式单例 . 单例模式有以下特点: 1.单例类只能有一个实例. 2.单例类 ...

  7. go设计模式之单例模式

    在这里插入图片描述# go设计模式之单例模式 在软件开发时,经常会遇到有些对象需要保证只有一个实例的,那么这种设计模式就应用而生. 定义 单例模式,也叫单子模式,是一种常用的软件设计模式,属于创建型模 ...

  8. 一篇博客读懂设计模式之---单例模式

    一篇博客读懂设计模式之---单例模式 一.  单例模式 单例对象(Singleton)是一种常用的设计模式.在Java应用中,单例对象能保证在一个JVM中,该对象只有一个实例存在.这样的模式有几个好处 ...

  9. Java 设计模式(3)单例模式

    前言 概念: java中单例模式是一种常见的设计模式,单例模式的写法有好几种,这里主要介绍三种:懒汉式单例.饿汉式单例.登记式单例. 单例模式有以下特点: 1.单例类只能有一个实例. 2.单例类必须自 ...

最新文章

  1. EXP6 信息搜集与漏洞扫描
  2. c#_List<T>(IEnumerable<T>)
  3. 异步任务AsyncTask
  4. 【颜值打分小程序】最火爆的“颜值测试”,做还是不做?(疯狂打call)
  5. Delphi IDE使用的一些主要技巧
  6. Linux命令-防火墙命令:iptables
  7. c语言验证寝室是否满人,寝室管理系统c语言.doc
  8. C语言编译器不检查数组下标越界
  9. XPath最通俗的教程(ZZ)
  10. gitlab简单使用教程【转】
  11. Centos添加ip黑名单禁止某个ip访问,对登陆失败的主机进行封禁
  12. java如何重复userinput_如何使用Scanner Java重复读取用户输入
  13. Java语言中的----条件循环
  14. 深度学习(三)----算法岗面试题
  15. ni软件可以卸载吗_电视盒子自带的软件居然可以这样卸载!
  16. 收藏!深度学习必读10篇经典算法论文总结!
  17. win7 升级IE11
  18. 基于i.mx6q平台的NES模拟器移植
  19. 【敏捷6.1】团队绩效理念与实践
  20. 甲骨文总裁埃里森:我的目标是击败微软

热门文章

  1. 嵌入式软硬件开发中遇到的坑
  2. 智能拨号的联系人快速模糊匹配的算法
  3. 【云周刊】第132期:走近40+世界级AI专家!第三届中国人工智能大会资料分享...
  4. DB2数据库常用工具
  5. TYVJ P1069 cowtour 看不懂题意
  6. LVS集群-DR负载均衡集群
  7. shell中获取时间
  8. 关于wpf窗体中Allowtransparent和WindowsFormsHost的纠纷
  9. 软件能力[置顶] 程序员如何成为设计师,软件公司如何成为苹果?
  10. avalon $computed不起作用?