肥貓學習日記-------------------C++單例模式>>懶漢模式

懶漢模式

什麼是懶漢模式

懶漢模式:
用靜態成員指針來指向單例類的唯一實例對象,只有真正調用獲取實例對象的靜態接口時,實例對象才被創建。
優點:什麼時用什麼時候創建,節約內存。
缺點:在第一調用訪問獲取實例對象的靜態接口才真正創建,如果在多線操作情況下有可能被創建出多個實例對象(雖然可能性很低),存在線程不安全問題。

#include <iostream>
using namespace std;

class Singleton
{
private:
	Singleton(void) { }
	static Singleton* objectp;
public:
	static Singleton& get_object(void)
	{
		if(NULL == objectp)
		{
			objectp = new Singleton;
		}
		return *objectp;
	}
	void show(void)
	{
		cout << "我是對象:" << objectp << endl;
	}
};

Singleton* Singleton:: objectp;

int main()
{
	Singleton str = Singleton::get_object();
	str.show();
	Singleton str1 = Singleton::get_object();
	str1.show();
}

如上所說該模式存在線程不安全的問題,但是我們可以通過線程加鎖來提高其安全性,如下

#include <iostream>
#include <pthread.h>

using namespace std;

pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
class Singleton
{
private:
	Singleton(void) { }
	static Singleton* objectp;
public:
	static Singleton& get_object(void)
	{
		if(NULL == objectp)
		{
			pthread_mutex_lock(&mutex);
			objectp = new Singleton;
			pthread_mutex_unlock(&mutes);
		}
		return *objectp;
	}
	void show(void)
	{
		cout << "我是對象:" << objectp << endl;
	}
};

Singleton* Singleton:: objectp;

int main()
{
	Singleton str = Singleton::get_object();
	str.show();
	Singleton str1 = Singleton::get_object();
	str1.show();
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章