设计模式6---(单例模式的概念及其实现(懒汉式和饿汉式),线程安全)
生活随笔
收集整理的这篇文章主要介绍了
设计模式6---(单例模式的概念及其实现(懒汉式和饿汉式),线程安全)
小编觉得挺不错的,现在分享给大家,帮大家做个参考.
单例模式
单例模式的概念
单例模式是一种对象创建型模式,使用单例模式,可以保证为一个类只生成唯一的实例对象。也就是说,在整个程序空间中,该类只存在一个实例对象。
GoF 对单例模式的定义是:保证一个类、只有一个实例存在,同时提供能对该实例加以访问的全局访问方法。
为什么适用单例模式
在应用系统开发中,我们常常有以下需求:
实现单例步骤常用步骤
懒汉式实现
如果单例对象构造十分耗时或者占用很多资源,比如加载插件啊, 初始化网络连接啊,读取文件啊等等,而有可能该对象程序运行时不会用到,那么也要在程序一开始就进行初始化,就会导致程序启动时非常的缓慢。 所以这种情况使用懒汉模式(延迟加载)更好。
//懒汉式,需要才创建 class Singleton_lazy{ private:Singleton_lazy(){}//防拷贝Singleton_lazy(Singleton const&);Singleton_lazy & operator=(Singleton const&); public:static Singleton_lazy *getInstace() //提供方法获取{if(nullptr == pSingleton) //其它线程看到指针不为空,说明已创建,直接用,不需要再等待{m_mtx.lock(); //加锁保证线程安全if (pSingleton == NULL){pSingleton = new Singleton_lazy;//new有可能失败,抛出异常造成死锁}m_mtx.unlock();return pSingleton;}}//内嵌垃圾回收类 RAII的思想class Garbo{~Garbo(){if (pSingleton != NULL){delete pSingleton;}}}; private:static Singleton_lazy * pSingleton;//类外初始化好static mutex m_mtx; //互斥锁 }; //类外初始化 volatile Singleton_lazy * Singleton_lazy::pSingleton = NULL; Singleton_lazy ::CGarbo Garbo; mutex Singleton::m_mtx;编译器有可能进行优化:指令的重排
可以加上volatile
本来的顺序
优化的顺序
饿汉式实现
就是说不管你将来用不用,程序启动时就创建一个唯一的实例对象。
//饿汉式,比较着急class Singleton_hungry{private:Singleton_hungry(){}//防止拷贝Singleton_hungry(Singleton const&);Singleton_hungry& operator=(Singleton const&);public:static Singleton_hungry *getInstace(){return pSingleton;}//实现内嵌垃圾回收类#if 0class Garbo{~Garbo(){if (pSingleton != NULL){delete pSingleton;}}};#endifprivate:static Singleton_hungry * pSingleton;};Singleton_hungry * Singleton_hungry::pSingleton = new Singleton_hungry;线程安全
总结
以上是生活随笔为你收集整理的设计模式6---(单例模式的概念及其实现(懒汉式和饿汉式),线程安全)的全部内容,希望文章能够帮你解决所遇到的问题。
- 上一篇: 疏通输卵管什么药物好呢
- 下一篇: 设计模式7----代理模式