真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

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

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

成都創(chuàng)新互聯(lián)公司長期為上千余家客戶提供的網(wǎng)站建設服務,團隊從業(yè)經(jīng)驗10年,關注不同地域、不同群體,并針對不同對象提供差異化的產(chǎn)品和服務;打造開放共贏平臺,與合作伙伴共同營造健康的互聯(lián)網(wǎng)生態(tài)環(huán)境。為獻縣企業(yè)提供專業(yè)的成都網(wǎng)站設計、成都網(wǎng)站制作,獻縣網(wǎng)站改版等技術服務。擁有十多年豐富建站經(jīng)驗和眾多成功案例,為您定制開發(fā)。

線程安全的單例:

懶漢模式(Lazy Loading):第一次獲取對象時才創(chuàng)建對象

class Singleton
{
public:
	//獲取唯一實例的接口函數(shù)
	static Singleton* GetInstance()
	{
		//雙重檢查,提高效率,避免高并發(fā)場景下每次獲取實例對象都進行加鎖
		if (_sInstance == NULL)
		{
			std::lock_guard lock(_mtx);

			if (_sInstance == NULL)
			{
				Singleton* tmp = new Singleton;
				MemoryBarrier(); //內(nèi)存柵欄,防止編譯器優(yōu)化
				_sInstance = tmp;
			}
		}
		
		return  _sInstance;
	}

	static void DelInstance()
	{
		if (_sInstance)
		{
			delete _sInstance;
			_sInstance = NULL;
		}
	}

	void Print()
	{
		std::cout << _data << std::endl;
	}

private:
	//構造函數(shù)定義為私有,限制只能在類內(nèi)實例化對象
	Singleton()
		:_data(10)
	{}

	//防拷貝
	Singleton(const Singleton&);
	Singleton& operator=(const Singleton&);

private:
	static std::mutex _mtx; //保證線程安全的互斥鎖
	static Singleton* _sInstance; //指向?qū)嵗闹羔樁x為靜態(tài)私有,這樣定義靜態(tài)成員獲取對象實例
	int _data; //單例類里面的數(shù)據(jù)
};

餓漢模式(Eager Loading):第一次獲取對象時,對象已經(jīng)創(chuàng)建好。

簡潔、高效、不用加鎖,但是在某些場景下會有缺陷。

/*方式一*/
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();
}

網(wǎng)站名稱:單例設計模式(懶漢模式、餓漢模式)C++
文章位置:http://weahome.cn/article/jdhoes.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部