廢話不多說,常用的代碼積淀下來。 一、懶漢模式:即第一次調(diào)用該類實(shí)例的時候才產(chǎn)生一個新的該類實(shí)例,并在以后僅返回此實(shí)例。 需要用鎖,來保證其線程安全性:原因:多個線程可能進(jìn)入判斷是否已經(jīng)存在實(shí)例的if語句,從而non thread safety. 使用double-check來保證thread safety.但是如果處理大量數(shù)據(jù)時,該鎖才成為嚴(yán)重的性能瓶頸。 1、靜態(tài)成員實(shí)例的懶漢模式: 1 class Singleton 2 { 3 private: 4 static Singleton* m_instance; 5 Singleton(){} 6 public: 7 static Singleton* getInstance(); 8 }; 9 10 Singleton* Singleton::getInstance() 11 { 12 if(NULL == m_instance) 13 { 14 Lock();//借用其它類來實(shí)現(xiàn),如boost 15 if(NULL == m_instance) 16 { 17 m_instance = new Singleton; 18 } 19 UnLock(); 20 } 21 return m_instance; 22 } 2、內(nèi)部靜態(tài)實(shí)例的懶漢模式 這里需要注意的是,C++0X以后,要求編譯器保證內(nèi)部靜態(tài)變量的線程安全性,可以不加鎖。但C++ 0X以前,仍需要加鎖。 1 class SingletonInside 2 { 3 private: 4 SingletonInside(){} 5 public: 6 static SingletonInside* getInstance() 7 { 8 Lock(); // not needed after C++0x 9 static SingletonInside instance; 10 UnLock(); // not needed after C++0x 11 return instance; 12 } 13 }; 二、餓漢模式:即無論是否調(diào)用該類的實(shí)例,在程序開始時就會產(chǎn)生一個該類的實(shí)例,并在以后僅返回此實(shí)例。 由靜態(tài)初始化實(shí)例保證其線程安全性,WHY?因?yàn)殪o態(tài)實(shí)例初始化在程序開始時進(jìn)入主函數(shù)之前就由主線程以單線程方式完成了初始化,不必?fù)?dān)心多線程問題。 故在性能需求較高時,應(yīng)使用這種模式,避免頻繁的鎖爭奪。 1 class SingletonStatic 2 { 3 private: 4 static const SingletonStatic* m_instance; 5 SingletonStatic(){} 6 public: 7 static const SingletonStatic* getInstance() 8 { 9 return m_instance; 10 } 11 }; 12 13 //外部初始化 before invoke main 14 const SingletonStatic* SingletonStatic::m_instance = new SingletonStatic; (完) |
|
來自: 流水晨香 > 《計算科學(xué)》
联系客服
微信扫码,添加客服企业微信
客服QQ:
1732698931联系电话:4000-999-276
客服工作时间9:00-18:00,晚上非工作时间,请在微信或QQ留言,第二天客服上班后会立即联系您。