中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

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

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

單例設計模式(懶漢模式、餓漢模式)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

金湖县| 徐汇区| 赤城县| 明光市| 乐至县| 长葛市| 睢宁县| 天祝| 石家庄市| 海晏县| 华容县| 华亭县| 健康| 三河市| 山西省| 龙井市| 宜阳县| 砚山县| 安康市| 江油市| 云安县| 云和县| 兴安盟| 沙田区| 那坡县| 巢湖市| 兰州市| 临高县| 滨海县| 文昌市| 馆陶县| 枣阳市| 维西| 扎鲁特旗| 什邡市| 科技| 图们市| 永善县| 轮台县| 兰考县| 孝昌县|