单例模式
Posted joezzz
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了单例模式相关的知识,希望对你有一定的参考价值。
1.概念
1)单例模式就是一个类只能被实例化一次 ,更准确的说是只能有一个实例化对象的类
2)为什么要有单例模式:一则,解决多线程并发访问的问题;二则节约系统资源
- 例如,一个系统中可以存在多个打印任务,但是只能有一个正在工作的打印任务
- 如在Windows中就只能打开一个任务管理器,如果不使用机制对窗口对象进行唯一化,将弹出多个窗口,如果这些窗口显示的内容完全一致,则是重复对象,浪费内存资源;如果这些窗口显示的内容不一致,则意味着在某一瞬间系统有多个状态,与实际不符,也会给用户带来误解,不知道哪一个才是真实的状态
3)
2.实现代码
class CSingleton { //懒汉模式 private: CSingleton()//把构造函数设为private,不让外界直接生成实例 { pthread_mutex_init(&mtx, 0); } static CSingleton* p; public: static pthread_mutex_t mtx; static CSingleton* getInstance()//外界通过调用这个public函数去获得实例 { if (p == NULL)//只实例化一次 { pthread_mutex_lock(&mtx); //如果两个线程同时获取实例化对象,这样就会造出两个实例了,所以要加锁 p = new CSingleton(); pthread_mutex_unlock(&mtx); } else return p; } }; pthread_mutex_t CSingleton::mtx; CSingleton* CSingleton::p = NULL; class CSingleton { //饿汉模式,不用加锁 private: CSingleton(){} static CSingleton *p; public: static CSingleton* getInstance() { return p; } }; CSingleton* CSingleton::p = new CSingleton();//在外界会调用 CSingleton::getInstance()之前这个类就已经被实例化了,所以不会出现多线程的安全问题
以上是关于单例模式的主要内容,如果未能解决你的问题,请参考以下文章