標籤:方法 變數 模式 let ini 第一次用 空間換時間 比較 餓漢
我們都很清楚一個簡單的單例模式該怎樣去實現:建構函式聲明為private或protect防止被外部函數執行個體化,內部儲存一個private static的類指標儲存唯一的執行個體,執行個體的動作由一個public的類方法代勞,該方法也返回單例類唯一的執行個體。單例大約有兩種實現方法:懶漢與餓漢。
懶漢:故名思義,不到萬不得已就不會去執行個體化類,也就是說在第一次用到類執行個體的時候才會去執行個體化,節省記憶體。
餓漢:餓了肯定要饑不擇食。所以在單例類定義的時候就進行執行個體化。浪費記憶體
特點與選擇:
由於要進行線程同步,所以在訪問量比較大,或者可能訪問的線程比較多時,採用餓漢實現,可以實現更好的效能。這是以空間換時間。
在訪問量較小時,採用懶漢實現。這是以時間換空間。
首先是餓漢模式:
餓漢,安全執行緒,不會記憶體流失class singleton{private:static singleton*p; singleton() {}~CSingleton() { if (p== NULL) { return ;} delete P; P = NULL; }public: static singleton* initance(); singleton* p = new singleton();//餓漢的體現,直接執行個體化,也就不存線上程不安全了。 singleton* initance() { return p; }};
懶漢模式:
方法一:使用加鎖來達到安全執行緒
class singleton{protected: singleton() { pthread_mutex_init(&mutex); }private: static singleton* p;public: static pthread_mutex_t mutex; static singleton* initance();}; pthread_mutex_t singleton::mutex;singleton* singleton::p = NULL;singleton* singleton::initance(){ if (p == NULL) { pthread_mutex_lock(&mutex); if (p == NULL) p = new singleton(); pthread_mutex_unlock(&mutex); } return p;}
方法二:使用內部靜態變數來達到安全執行緒
class singleton{protected: singleton() { pthread_mutex_init(&mutex); }public: static pthread_mutex_t mutex; static singleton* initance(); int a;}; pthread_mutex_t singleton::mutex;singleton* singleton::initance(){ pthread_mutex_lock(&mutex); static singleton obj; pthread_mutex_unlock(&mutex); return &obj;}
安全執行緒的單一實例模式