单例模式

来源:互联网 发布:caro emerald知乎 编辑:程序博客网 时间:2024/05/16 14:25

单例模式

定义: 在程序运行中, 只能生成一个对象 的模式

模式要点: 1, 为了保证在 外部 不被定义对象, 需要把构造函数设置成私有属性

2, 故此, 需要一个static函数来定义对象, 又因唯一性, 需要一个static指针变量来保证不重复 创建

3, 虽然唯一, 但可以被多个函数或对象公用, 为防止在销毁时 多次释放同一指针 , 需要一个static整形变量计数

4,为防止多个线程同时调用,引起的线程不安全, 需要一个互斥锁, 锁住static指针变量, 故锁也是static属性

5,仅在第一次创建的时候需要调用互斥锁, 为防止多次调用内核, 因在前面再加一次判断


下面是代码是例

#include <iostream>#include <pthread.h>using namespace std;// 懒汉式单例class UserManage{private:UserManage(){cout << "用户管理器被构造" << endl;sleep(5);}public:static UserManage * GetInstance()//创造句柄{count ++;if(m_instance == NULL)  // 判断, 防止多次开锁解锁{pthread_mutex_lock(&mutex);// 上锁if(m_instance == NULL)m_instance = new UserManage; // 构造pthread_mutex_unlock(&mutex);// 解锁}return m_instance;}static void Release()// 释放句柄{count --;pthread_mutex_lock(&mutex);if(m_instance != NULL && count == 0){delete m_instance;m_instance = NULL;}pthread_mutex_unlock(&mutex);}private:static pthread_mutex_t mutex;static UserManage * m_instance;static int count;};
//静态变量 需要在外部初始化
UserManage * UserManage::m_instance = NULL;int UserManage::count = 0;pthread_mutex_t UserManage::mutex = PTHREAD_MUTEX_INITIALIZER; void  *func(void* v){UserManage *um = UserManage::GetInstance();//UserManage::Release();}int main(){pthread_t id[10];for(int i = 0; i<10; i++){pthread_create(&id[i], NULL, func, NULL);pthread_detach(id[i]); }pthread_exit(NULL);    // 终止主线程return 0;}

原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 小孩咳喘有痰怎么办 都说我不爱说话怎么办 宝宝突然结巴了怎么办 淘宝客户不理人怎么办 遇到不说话客户怎么办 同学群没人聊怎么办 群里没人说话怎么办 儿童说话声音沙哑怎么办 孩子不和外人说话怎么办 同学退群该怎么办 宝宝睡觉枕头湿怎么办 一个多月的小宝宝便秘怎么办 小宝宝便秘拉屎困难怎么办 一岁小宝宝便秘怎么办 客户不听我说话怎么办 微信上客户不理怎么办 小宝宝母乳不够吃怎么办 小宝宝吃母乳拉肚子怎么办 母乳小宝宝吃奶吃不了怎么办 婴儿感冒吐奶怎么办 小孩感冒吐奶怎么办 小孩吐奶怎么办月子 新生儿一直吐奶怎么办 宝宝50天吐奶厉害怎么办 小儿吐奶厉害怎么办 宝宝一直便秘了怎么办 误建了微信群聊怎么办 新生儿大口吐奶怎么办 宝宝喝了就吐奶怎么办 婴儿顿顿吐奶怎么办 说话着急就结巴怎么办 幼儿舌头长泡怎么办 一着急说话结巴怎么办 幼儿舌头又溃疡怎么办 3儿童说话结巴怎么办 孩子小舌头短怎么办? 6岁讲话不清楚怎么办 三岁宝宝结巴怎么办 新生儿儿有舌苔怎么办 严重口吃的孩子怎么办 口吃越来越严重了怎么办