|
廢話不多說,常用的代碼積淀下來(lái)。 一、懶漢模式:即第一次調(diào)用該類實(shí)例的時(shí)候才產(chǎn)生一個(gè)新的該類實(shí)例,并在以后僅返回此實(shí)例。 需要用鎖,來(lái)保證其線程安全性:原因:多個(gè)線程可能進(jìn)入判斷是否已經(jīng)存在實(shí)例的if語(yǔ)句,從而non thread safety. 使用double-check來(lái)保證thread safety.但是如果處理大量數(shù)據(jù)時(shí),該鎖才成為嚴(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();//借用其它類來(lái)實(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 }; 二、餓漢模式:即無(wú)論是否調(diào)用該類的實(shí)例,在程序開始時(shí)就會(huì)產(chǎn)生一個(gè)該類的實(shí)例,并在以后僅返回此實(shí)例。 由靜態(tài)初始化實(shí)例保證其線程安全性,WHY?因?yàn)殪o態(tài)實(shí)例初始化在程序開始時(shí)進(jìn)入主函數(shù)之前就由主線程以單線程方式完成了初始化,不必?fù)?dān)心多線程問題。 故在性能需求較高時(shí),應(yīng)使用這種模式,避免頻繁的鎖爭(zhē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; (完) |
|
|
來(lái)自: 流水晨香 > 《計(jì)算科學(xué)》