?在一個進程中,一個類僅創(chuàng)建一個唯一的實例,并提供一個訪問它的全局訪問點,該實例被所有程序模塊共享。
?主要應用場景有:日志記錄,配置管理,線程池,連接池,內存池等。
1. 構造函數私有化
包括普通構造函數,拷貝構造函數,賦值操作符重載函數,防止出現一個以上的實例。
2. 使用類的私有靜態(tài)指針變量指向類的唯一實例
3. 使用一個公有的靜態(tài)方法獲取該實例
class Singleton
{
private:
?? ?static Singleton* instance;
private:
?? ?Singleton() {};
?? ?~Singleton() {};
?? ?Singleton(const Singleton&);
?? ?Singleton& operator=(const Singleton&);
public:
?? ?static Singleton* getInstance()?
? ? {
?? ??? ?if(instance == NULL)
?? ??? ??? ?instance = new Singleton();
?? ??? ?return instance;
?? ?}
};
?
// init static member
Singleton* Singleton::instance = NULL;
4. 線程安全?線程安全問題根本原因:兩個線程同時調用getInstance(),可能產生兩個實例。
? 一般考慮加鎖的方式避免線程安全問題,但加鎖比較繁瑣,并且稍有不慎仍然可能出問題。
? 本文從用法上來避免線程安全問題,此方法簡單明了,不會出錯,適合大部分場景。
? 本文的用法如下:
? 在主線程中事先創(chuàng)建好實列,以后在其他線程中僅僅獲取該實例指針進行使用。
你是否還在尋找穩(wěn)定的海外服務器提供商?創(chuàng)新互聯www.cdcxhl.cn海外機房具備T級流量清洗系統配攻擊溯源,準確流量調度確保服務器高可用性,企業(yè)級服務器適合批量采購,新人活動首月15元起,快前往官網查看詳情吧