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