廢話不多說,常用的代碼積淀下來。 一、懶漢模式:即第一次調(diào)用該類實例的時候才產(chǎn)生一個新的該類實例,并在以后僅返回此實例。 需要用鎖,來保證其線程安全性:原因:多個線程可能進入判斷是否已經(jīng)存在實例的if語句,從而non thread safety. 使用double-check來保證thread safety.但是如果處理大量數(shù)據(jù)時,該鎖才成為嚴重的性能瓶頸。 1、靜態(tài)成員實例的懶漢模式: 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();//借用其它類來實現(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)實例的懶漢模式 這里需要注意的是,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)用該類的實例,在程序開始時就會產(chǎn)生一個該類的實例,并在以后僅返回此實例。 由靜態(tài)初始化實例保證其線程安全性,WHY?因為靜態(tài)實例初始化在程序開始時進入主函數(shù)之前就由主線程以單線程方式完成了初始化,不必擔心多線程問題。 故在性能需求較高時,應(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; (完) |
|