C 實現單例模式

2021-08-04 15:54:56 字數 1915 閱讀 4655

我們都很清楚乙個簡單的單例模式該怎樣去實現:建構函式宣告為private防止被外部函式例項化,內部儲存乙個private static的類指標儲存唯一的例項,例項的動作由乙個public的類方法代勞,該方法返回單例類唯一的例項。

class

singleton

static singleton* instance;//private static的類指標儲存唯一的例項

public:

static singleton* getinstance();//靜態成員方法獲取例項

};singleton* singleton::instance = null;

singleton* singleton::getinstance()

現在如果有兩個執行緒同時呼叫getinstance方法且同時檢測到instance 是null值,則兩個執行緒會同時構造乙個例項給instance ,這是非常錯誤的操作。

現在來介紹一下安全的操作方法:

1、懶漢模式:典型的時間換空間,也就是每次獲取例項都會進行判斷,看是否需要建立例項,浪費判斷的時間。當然,如果一直沒有人使用的話,那就不會建立例項,則節約記憶體空間。第一次用到類例項的時候才會去例項化。其實上面的例項就屬於懶漢模式,但是它是執行緒不安全的。

執行緒安全的懶漢模式(加鎖):

class

singleton

static singleton* instance ;

public:

static pthread_mutex_t mutex;

static singleton* getinitance();

};pthread_mutex_t singleton::mutex = pthread_mutex_initializer;

singleton* singleton::instance = null;

singleton* singleton::getinitance()

return instance ;

}

內部靜態變數的懶漢模式:

class singleton

public:

static pthread_mutex_t mutex;

static singleton* getinitance();

};pthread_mutex_t singleton::mutex = pthread_mutex_initializer;

singleton* singleton::getinitance()

return &obj;

}

2、餓漢模式:典型的空間換時間,當類裝載的時候就會建立類例項,不管你用不用,先建立出來,然後每次呼叫的時候,就不需要再判斷了,節省了執行時間。單例類定義的時候就進行例項化。

餓漢模式本身就是執行緒安全的:

class singleton

static singleton* instance;

public:

static singleton* getinstance();

};singleton* singleton::instance = new singleton();

singleton* singleton::getinstance()

兩種模式的適用場景:

餓漢模式:訪問量比較大,或者可能訪問的執行緒比較多時,由於要進行執行緒同步,採用餓漢模式,可以實現更好的效能。這是以空間換時間。

懶漢模式:在訪問量較小時,採用懶漢實現。這是以時間換空間。

C 實現單例模式

給所需要進行單例的類ctest的建構函式宣告為private或者protected 防止在類外隨意生成ctest的物件 然後宣告乙個靜態成員變數 instance 乙個靜態成員函式getinsance staticctest getinstance staticctest instance 靜態成員...

C 實現單例模式

ifndef singleton h define singleton h include include using namespace std class locker inline locker inline void lock inline void unlock private pthre...

C 實現單例模式

class singleton 私有建構函式 singleton const singleton 拷貝建構函式,只宣告不定義,這要當使用者或友元想要拷貝構造該類的已存在例項時會出錯。singleton operator const singleton 賦值運算子,只宣告不定義,作用同上 public...