生活随笔
收集整理的這篇文章主要介紹了
c++实现单例类(懒汉与饿汉)
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
教科書(shū)里的單例模式
我們都很清楚一個(gè)簡(jiǎn)單的單例模式該怎樣去實(shí)現(xiàn):構(gòu)造函數(shù)聲明為private或protect防止被外部函數(shù)實(shí)例化,內(nèi)部保存一個(gè)private static的類指針保存唯一的實(shí)例,實(shí)例的動(dòng)作由一個(gè)public的類方法代勞,該方法也返回單例類唯一的實(shí)例。
上代碼:
| 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; } ?懶漢與餓漢 單例大約有兩種實(shí)現(xiàn)方法:懶漢與餓漢。 -
- 懶漢:故名思義,不到萬(wàn)不得已就不會(huì)去實(shí)例化類,也就是說(shuō)在第一次用到類實(shí)例的時(shí)候才會(huì)去實(shí)例化,所以上邊的經(jīng)典方法被歸為懶漢實(shí)現(xiàn);
- 餓漢:餓了肯定要饑不擇食。所以在單例類定義的時(shí)候就進(jìn)行實(shí)例化。
特點(diǎn)與選擇: -
- 由于要進(jìn)行線程同步,所以在訪問(wèn)量比較大,或者可能訪問(wèn)的線程比較多時(shí),采用餓漢實(shí)現(xiàn),可以實(shí)現(xiàn)更好的性能。這是以空間換時(shí)間。
- 在訪問(wèn)量較小時(shí),采用懶漢實(shí)現(xiàn)。這是以時(shí)間換空間。
3 線程安全的懶漢實(shí)現(xiàn) 線程不安全,怎么辦呢?最直觀的方法:加鎖。 #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實(shí)現(xiàn) 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內(nèi)部靜態(tài)變量的懶漢實(shí)現(xià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餓漢實(shí)現(xiàn)-》線程安全 class single { protected: single() {} private: static single *s; public: static single* instant();? }; single* single::s=new single(); single* single::instant() { return s; } |
超強(qiáng)干貨來(lái)襲 云風(fēng)專訪:近40年碼齡,通宵達(dá)旦的技術(shù)人生
總結(jié)
以上是生活随笔為你收集整理的c++实现单例类(懒汉与饿汉)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。