一句话 C++单例模式
来源:互联网 发布:自考java程序设计试题 编辑:程序博客网 时间:2024/05/21 20:43
C++单例模式这个东西,永远处在一个会与不会的状态之间。学生时期没搞懂的现在来还账了!
一句话:
单例模式的作用不必多提。最多的也不过是“饿汉”,“饿汉”加锁,“懒汉”这几种。
之间一片博客中阐述过我对C++中static的看法:http://blog.csdn.net/qq_28171461/article/details/78822746
1, static是用来管理类的,找一个维度更高的来管理类的创建(当然类比对象又高一个level)( static---》类----》对象)。因为高于类,static指针变量自然可以放到类的任意权限位置(private,protect,public)。(函数同理适用)
2. 懒汉: static函数中,进行新建一个对象。并进行是否为空的判断(敲黑板,划重点)。 (懒在哪里,释义:用的时候才初始化)
有判断就存在多线程同时进入修改的情况,所以lock应运而生。 (有个双层加锁的大家可以找找,因为笨我只能是先搞功能,再优化)(饿在哪里,释义:很饿了,不用我 也把你占着,吃着碗里看着锅里)
饿汉:在static 指针初始化的时候就new对象, 这样在main中不好写代码,但是线程安全。
优异分析:
懒汉: 资源消耗是动态的,根据你的创建走。缺点在于多线程的控制,耗时!!时间换资源
饿汉:如果单例本来资源比较多,但是不需要创建那么早,就会消耗资源。资源换时间
code:
#include <iostream>using namespace std;class single{private:int x;static single * ptr;public:single( int m ){x=m;cout<<"single()"<<"data is"<<x<<endl;//x=m;}~single(){cout<<" ~single(), the object has been erase"<<endl;if (ptr!=NULL){ delete ptr;}}static single *getinstance(int n){ //这里是懒汉的点,这样写的好处在于我可以在main中赋值。// 加锁的操作在这里,双层加锁也在这里
if (ptr==NULL){ ptr=new single(n);return ptr;}else{ cout<<"the object has been create"<<endl;}}};single * single::ptr=NULL;
// single * single::ptr=new single(n); //这个是饿汉的点,不方便main中调用,但是很安全有木有。
int main (void){single *a1=single::getinstance(3);single *a2=single::getinstance(4);getchar();return 0;}
Singleton* getInstance(){ lock(); if (instance == NULL) { instance = new Singleton(); } unlock(); return instance;}这样写的话,会稍稍影响性能,因为每次判断是否为空都需要被锁定(后边来的线程都得等待锁,你又不人家创建,别让人家等了。)。如果有很多线程的话,就爱会造成大量线程的阻塞。于是大神们又想出了双重锁定(我只放第一个线程进来,然后加锁,别的线程你们就别来了,也别傻等了)。
Singleton* getInstance(){ if (instance == NULL) {lock(); if (instance == NULL) { instance = new Singleton(); } unlock(); } return instance;}
阅读全文
0 0
- 一句话 C++单例模式
- swift单例模式一句话实现
- C#单例模式
- C#-单例模式
- 单例模式(C++)
- 【C++】单例模式
- [C++]单例模式
- 单例模式(C++)
- C ++的单例模式
- 【C++】Chapter17:单例模式
- Object-c单例模式
- Objectove-c单例模式
- Objective C--单例模式
- Objective C--单例模式
- Objective C 单例模式
- Objective C--单例模式
- 单例模式(C#)
- 单例模式(C#)
- 贪心专练1 区间调度最多问题
- 剑指offer 编程题(11):求双精度底数的次幂
- 17.12.15
- BeautifulSoup常用的函数
- 用老毛桃重装win7,64位系统
- 一句话 C++单例模式
- Kotlin的解构定义
- redis 安装
- 小游戏三子棋的C语言代码实现
- Ubuntu 16.04 安装有道词典
- 四个常用的Linux文件基本操作管理命令
- python模块之JSON模块
- 【算法】Kmp算法初见
- 12.15