C 單例模式

2021-08-19 21:06:24 字數 1602 閱讀 1825

1、教科書裡的單例模式

簡單的單例模式實現起來是很簡單的:只需將類的建構函式宣告為private或者protect防止被外部例項化,內部儲存乙個private static的類指標儲存唯一的例項,例項動作由乙個public的類方法代勞,該方法也返回單例的唯一例項。**實現如下:

class csignal

;private:

static csignal *m_pinstance;

}csignal *csignal::m_pinstance = null;

csignal *csiganl::getinstance()

return m_pinstance;

}

這是單例模式的簡單實現,簡單易懂,但是這不是乙個完美的實現,這個方法不是執行緒安全的,當有兩個執行緒同時首次呼叫getinstance方法且同時檢測到m_pinstance的值是null,這兩個執行緒就會同時構造乙個例項m_pinstance,這是個嚴重的錯誤,同時,這也不是單例的唯一實現!

2、懶漢與惡漢

單例的實現大體上有兩種實現方法:懶漢實現與餓漢實現。

懶漢:乙個字就是懶,不到萬不得已的時候不會去例項化類,也就是說第一次用到類例項的時候才會去例項化,所以上邊的教科書式的寫法屬於懶漢實現;

餓漢:餓了就要吃東西,而且是飢不擇食,所以餓漢實現就是在單例類定義的時候就進行例項化。

兩種實現模式的特點與選擇:

由於要進行執行緒同步,所以訪問量比較大,或者可能訪問的執行緒比較多時,採用餓漢實現,可以實現更好的效能。這是以空間換時間。在訪問量較小的時候,採用懶漢實現,這是以時間換空間。

3、執行緒安全的懶漢實現

執行緒不安全,最直觀的方法就是枷鎖。

方法1:加鎖的經典懶漢實現:

class csignal

;private:

static csignal *m_pinstance;

}csignal*csignal::m_pinstance=null;

csignal *csiganl::getinstance()

pthread_mutex_unlock(&mutex)

}return m_pinstance;

}

方法2:內部靜態變數的懶漢實現

class csignal;}

pthread_mutex_t signal::mutex;

csignal *csiganl::getinstance()

4、餓漢實現

餓漢實現是執行緒安全的,不用加鎖,這種就是用空間換取時間,多執行緒可以使用這種實現。**如下:

class csignal

;private:

static csignal *m_pinstance;

}csignal *csignal::m_pinstance = new csignal;

csignal *csiganl::getinstance()

C 單例模式

include using namespace std 單例類的c 實現 class singleton 構造方法實現 singleton singleton void singleton setvar int var main int main int argc,char argv return ...

C 單例模式

實現方式一 include template typename t class singleton boost noncopyable static void init private static pthread once t ponce statict value template typena...

C 單例模式

效率有點低,但是還算安全的單例模式,靜態成員實現方式 class singleton public static singleton getinstance singleton singleton getinstance unlock return m instance 內部靜態例項的懶漢模式,c ...