生活随笔
收集整理的这篇文章主要介绍了
c++实现单例类(懒汉与饿汉)
小编觉得挺不错的,现在分享给大家,帮大家做个参考.
教科书里的单例模式
我们都很清楚一个简单的单例模式该怎样去实现:构造函数声明为private或protect防止被外部函数实例化,内部保存一个private static的类指针保存唯一的实例,实例的动作由一个public的类方法代劳,该方法也返回单例类唯一的实例。
上代码:
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | class singleton { protected: singleton(){} private: static singleton* p; public: static singleton* instance(); }; singleton* singleton::p = NULL; singleton* singleton::instance() { if (p == NULL) p = new singleton(); return p; } 懒汉与饿汉 单例大约有两种实现方法:懒汉与饿汉。 -
- 懒汉:故名思义,不到万不得已就不会去实例化类,也就是说在第一次用到类实例的时候才会去实例化,所以上边的经典方法被归为懒汉实现;
- 饿汉:饿了肯定要饥不择食。所以在单例类定义的时候就进行实例化。
特点与选择: -
- 由于要进行线程同步,所以在访问量比较大,或者可能访问的线程比较多时,采用饿汉实现,可以实现更好的性能。这是以空间换时间。
- 在访问量较小时,采用懒汉实现。这是以时间换空间。
3 线程安全的懒汉实现 线程不安全,怎么办呢?最直观的方法:加锁。 #include<iostream> using namespace std; class single { protected: single() {} private: static single *s; public: static single* instant(); }; single* single::s=NULL; single* single::instant() { if(s==NULL) { s=new single(); } return s; } //懒汉加锁s实现 class single { protected: single() { pthread_mutex_initI(&mutex); } private: static single *s; static pthread_mutex_t mutex; public: static single* instant(); }; pthread_mutex_t single::mutex; single* single::s=NULL; single* single::instant() { if(p==NULL) { pthread_mutex_lock(&mutex); if(s==NULL) { s=new single(); } pthread_mutex_unlock(&mutex); } return s; } //n内部静态变量的懒汉实现 class single { protected: single() { pthread_mutex_init(&mutex); } private: static int a; static pthread_mutex_t mutex; static single* instant(); }; pthread_mutex_t single::mutex; single* single::instant() { pthread_mutex_lock(&mutex); static single obj; pthread_mutex_unlock(&mutex); return &obj; } //e饿汉实现-》线程安全 class single { protected: single() {} private: static single *s; public: static single* instant(); }; single* single::s=new single(); single* single::instant() { return s; } |
超强干货来袭 云风专访:近40年码龄,通宵达旦的技术人生
总结
以上是生活随笔为你收集整理的c++实现单例类(懒汉与饿汉)的全部内容,希望文章能够帮你解决所遇到的问题。
如果觉得生活随笔网站内容还不错,欢迎将生活随笔推荐给好友。