您好,登錄后才能下訂單哦!
單例模式:全局唯一實例,提供一個很容易獲取這個實例的接口
線程安全的單例:
懶漢模式(Lazy Loading):第一次獲取對象時才創建對象
class Singleton { public: //獲取唯一實例的接口函數 static Singleton* GetInstance() { //雙重檢查,提高效率,避免高并發場景下每次獲取實例對象都進行加鎖 if (_sInstance == NULL) { std::lock_guard<std::mutex> lock(_mtx); if (_sInstance == NULL) { Singleton* tmp = new Singleton; MemoryBarrier(); //內存柵欄,防止編譯器優化 _sInstance = tmp; } } return _sInstance; } static void DelInstance() { if (_sInstance) { delete _sInstance; _sInstance = NULL; } } void Print() { std::cout << _data << std::endl; } private: //構造函數定義為私有,限制只能在類內實例化對象 Singleton() :_data(10) {} //防拷貝 Singleton(const Singleton&); Singleton& operator=(const Singleton&); private: static std::mutex _mtx; //保證線程安全的互斥鎖 static Singleton* _sInstance; //指向實例的指針定義為靜態私有,這樣定義靜態成員獲取對象實例 int _data; //單例類里面的數據 };
餓漢模式(Eager Loading):第一次獲取對象時,對象已經創建好。
簡潔、高效、不用加鎖,但是在某些場景下會有缺陷。
/*方式一*/ class Singleton { public: static Singleton* GetInstance() { static Singleton sInstance; return &sInstance; } void Print() { std::cout << _data << std::endl; } private: Singleton() :_data(10) {} Singleton(const Singleton&); Singleton& operator=(const Singleton&); private: static Singleton* _sInstance; int _data; }; void TestSingleton() { Singleton::GetInstance()->Print(); }
/*方式二*/ class Singleton { public: static Singleton* GetInstance() { static Singleton sInstance; return &sInstance; } static void DelInstance() { if (_sInstance) { delete _sInstance; _sInstance = NULL; } } void Print() { std::cout << _data << std::endl; } private: Singleton() :_data(10) {} Singleton(const Singleton&); Singleton& operator=(const Singleton&); private: static Singleton* _sInstance; int _data; }; Singleton* Singleton::_sInstance = new Singleton; void TestSingleton() { Singleton::GetInstance()->Print(); Singleton::DelInstance(); }
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。