亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

單例設計模式(懶漢模式、餓漢模式)C++

發布時間:2020-07-24 04:23:26 來源:網絡 閱讀:1225 作者:zgw285763054 欄目:編程語言

單例模式:全局唯一實例,提供一個很容易獲取這個實例的接口


線程安全的單例:

懶漢模式(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();
}


向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

文登市| 溆浦县| 阿荣旗| 繁峙县| 洪洞县| 潢川县| 论坛| 山东| 枣阳市| 江油市| 麻江县| 平谷区| 吴忠市| 滨州市| 应用必备| 唐山市| 绥芬河市| 嘉禾县| 卫辉市| 灵璧县| 龙口市| 铁力市| 通州区| 西充县| 许昌县| 民和| 绵阳市| 开阳县| 缙云县| 孟连| 永修县| 含山县| 扶绥县| 和顺县| 桐柏县| 油尖旺区| 吉首市| 沿河| 崇文区| 睢宁县| 石城县|