廢話不多說,常用的代碼積澱下來。
一、懶漢模式:即第一次調用該類執行個體的時候才產生一個新的該類執行個體,並在以後僅返回此執行個體。
需要用鎖,來保證其執行緒安全性:原因:多個線程可能進入判斷是否已經存在執行個體的if語句,從而non thread safety.
使用double-check來保證thread safety.但是如果處理大量資料時,該鎖才成為嚴重的效能瓶頸。
1、靜態成員執行個體的懶漢模式:
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();//借用其它類來實現,如boost15 if(NULL == m_instance)16 {17 m_instance = new Singleton;18 }19 UnLock();20 }21 return m_instance;22 }
2、內部靜態執行個體的懶漢模式
這裡需要注意的是,C++0X以後,要求編譯器保證內部靜態變數的執行緒安全性,可以不加鎖。但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++0x11 return instance; 12 }13 };
二、餓漢模式:即無論是否調用該類的執行個體,在程式開始時就會產生一個該類的執行個體,並在以後僅返回此執行個體。
由靜態初始化執行個體保證其執行緒安全性,WHY?因為靜態執行個體初始化在程式開始時進入主函數之前就由主線程以單線程方式完成了初始化,不必擔心多線程問題。
故在效能需求較高時,應使用這種模式,避免頻繁的鎖爭奪。
1 class SingletonStatic 2 { 3 private: 4 static const SingletonStatic* m_instance; 5 SingletonStatic(){} 6 public: 7 static SingletonStatic* getInstance() 8 { 9 return m_instance;10 }11 };12 13 //外部初始化 before invoke main14 const SingletonStatic* SingletonStatic::m_instance = new SingletonStatic;
(完)