91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

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

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

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

金昌市| 池州市| 京山县| 正安县| 盱眙县| 安康市| 江山市| 新密市| 德令哈市| 威海市| 蒲城县| 双流县| 英德市| 六盘水市| 若尔盖县| 射阳县| 双桥区| 滦平县| 平凉市| 贵南县| 余江县| 千阳县| 淮南市| 贡觉县| 两当县| 雅江县| 汾阳市| 江华| 乌兰浩特市| 平乡县| 莱西市| 维西| 高阳县| 区。| 从江县| 和平县| 宜兰县| 华阴市| 泗水县| 南靖县| 邵阳市|