设计模式复习-单例模式
#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来解决问题,感兴趣的可以了解一下,我的思路是用汇编处理这个地方。不管用什么方式,注意一点,就是编译器会对我们的代码进行优化。也就是变换了很多姿势,最后转出来的汇编是一样的。这个地方要注意。
设计模式复习-单例模式相关推荐
- socket可以写成单例嘛_精读《设计模式 - Singleton 单例模式》
Singleton(单例模式) Singleton(单例模式)属于创建型模式,提供一种对象获取方式,保证在一定范围内是唯一的. 意图:保证一个类仅有一个实例,并提供一个访问它的全局访问点. 其实单例模 ...
- 设计模式复习-抽象工厂模式
设计模式复习-抽象工厂模式 有两种硬件,PC和Phone,有两种系统,Windows和Linux,现在假设PC和Phone上全都能安装这两个系统,并且将来硬件不会在变化,但是系统可能需要扩展,比如扩展 ...
- 设计模式复习-工厂方法模式
设计模式复习-工厂方法模式 相对于简单工厂,工厂方法是把算法类的实例化延迟到了调用者那去做,调用者根据自己的需要,自己实例化相关的工厂并且生产相关算法.这么做是因为简单工厂是不满足OCP的,因为如果 ...
- C#设计模式(1)——单例模式
原文地址:http://www.cnblogs.com/zhili/p/SingletonPatterm.html 一.引言 最近在设计模式的一些内容,主要的参考书籍是<Head First 设 ...
- java设计模式之单例模式(七种方法)
单例模式:个人认为这个是最简单的一种设计模式,而且也是在我们开发中最常用的一个设计模式. 单例模式的意思就是只有一个实例.单例模式确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例.这个 ...
- java单例模式的七种写法_Java设计模式之单例模式的七种写法
什么是单例模式? 单例模式是一种常见的设计模式,单例模式的写法有很多种,这里主要介绍三种: 懒汉式单例模式.饿汉式单例模式.登记式单例 . 单例模式有以下特点: 1.单例类只能有一个实例. 2.单例类 ...
- go设计模式之单例模式
在这里插入图片描述# go设计模式之单例模式 在软件开发时,经常会遇到有些对象需要保证只有一个实例的,那么这种设计模式就应用而生. 定义 单例模式,也叫单子模式,是一种常用的软件设计模式,属于创建型模 ...
- 一篇博客读懂设计模式之---单例模式
一篇博客读懂设计模式之---单例模式 一. 单例模式 单例对象(Singleton)是一种常用的设计模式.在Java应用中,单例对象能保证在一个JVM中,该对象只有一个实例存在.这样的模式有几个好处 ...
- Java 设计模式(3)单例模式
前言 概念: java中单例模式是一种常见的设计模式,单例模式的写法有好几种,这里主要介绍三种:懒汉式单例.饿汉式单例.登记式单例. 单例模式有以下特点: 1.单例类只能有一个实例. 2.单例类必须自 ...
最新文章
- EXP6 信息搜集与漏洞扫描
- c#_List<T>(IEnumerable<T>)
- 异步任务AsyncTask
- 【颜值打分小程序】最火爆的“颜值测试”,做还是不做?(疯狂打call)
- Delphi IDE使用的一些主要技巧
- Linux命令-防火墙命令:iptables
- c语言验证寝室是否满人,寝室管理系统c语言.doc
- C语言编译器不检查数组下标越界
- XPath最通俗的教程(ZZ)
- gitlab简单使用教程【转】
- Centos添加ip黑名单禁止某个ip访问,对登陆失败的主机进行封禁
- java如何重复userinput_如何使用Scanner Java重复读取用户输入
- Java语言中的----条件循环
- 深度学习(三)----算法岗面试题
- ni软件可以卸载吗_电视盒子自带的软件居然可以这样卸载!
- 收藏!深度学习必读10篇经典算法论文总结!
- win7 升级IE11
- 基于i.mx6q平台的NES模拟器移植
- 【敏捷6.1】团队绩效理念与实践
- 甲骨文总裁埃里森:我的目标是击败微软