單例模式是一種非常常用的設計模式,幾乎在稍大的工程專案中都會用到。單例類保證在全域性中只有唯一乙個類的例項物件,並且在類的內部提供了獲取這個唯一例項的介面。在類中,例項化出乙個物件需要呼叫建構函式,為了防止在類的外部呼叫建構函式構造出例項,對類的建構函式就應有所限制,可以將建構函式的訪問許可權設定為private或protected。還要提供乙個訪問例項的介面,在類中定義乙個static函式,返回類內部唯一的例項物件即可。
---------------------
#include class singleton
//防拷貝
singleton(const singleton&);
singleton& operator=(const singleton&);
public:
static singleton* getinstance() //宣告乙個靜態型別的介面來獲取例項
}return _instance;
}void delinstance() //銷毀例項
}private:
int _a;
static singleton* _instance;//宣告乙個靜態成員作為類的例項
static mutex _mtx;//保證執行緒安全的互斥鎖
};singleton* singleton::_instance = null; //初始化靜態成員變數
mutex singleton::_mtx;
以上**中加了互斥鎖,保證了執行緒安全。但也不是絕對安全的,因為加鎖或解鎖會引入新的問題,有可能拋異常或者造成死鎖。解決了執行緒安全,那麼就可以進一步提高效率。在上述**中,可以看到用了兩次判斷,也叫雙檢查機制,這就保證了只在第一次獲取物件時加鎖,避免高併發場景下每次獲取例項物件都進行加鎖,提高了效率。
---------------------
懶漢模式:在第一次呼叫getinstance的時候才例項化出物件,此後返回的都是該物件。相對餓漢模式而言,複雜,要確保執行緒安全問題,但在各種場景下都適用。
餓漢模式:無論是否需要該類的例項,在程式一開始的時候會產生該類的例項物件,此後返回的都是該物件。由於是在main函式之前建立執行緒,可能會出現不確定問題,適用性受到限制。
上面**實現的是懶漢模式,那麼下邊就實現餓漢模式
---------------------
namespace hungry
//防拷貝
singleton(const singleton&);
singleton& operator=(const singleton&);
public:
//static singleton& getinstance()
//static singleton& getinstance() //在類內部建立靜態例項,全域性只此乙份
void delinstance() //銷毀例項
}private:
int _a;
static singleton* _instance;
};singleton* singleton::_instance = null;
//singleton* singleton::_instance = new singleton();//全域性生成乙個例項物件
}
C 實現執行緒安全單例類
單例模式是一種非常常用的設計模式,幾乎在稍大的工程專案中都會用到。單例類保證在全域性中只有唯一乙個類的例項物件,並且在類的內部提供了獲取這個唯一例項的介面。在類中,例項化出乙個物件需要呼叫建構函式,為了防止在類的外部呼叫建構函式構造出例項,對類的建構函式就應有所限制,可以將建構函式的訪問許可權設定為...
c 多執行緒單例模式 執行緒安全C 單例模式
我對此處記錄的單例模式有一些疑問 http us library ff650316.aspx 以下 摘自該文章 using system public sealed class singleton private static volatile singleton instance private ...
C 執行緒安全的單例模式
廢話不多說,常用的 積澱下來。一 懶漢模式 即第一次呼叫該類例項的時候才產生乙個新的該類例項,並在以後僅返回此例項。需要用鎖,來保證其執行緒安全性 原因 多個執行緒可能進入判斷是否已經存在例項的if語句,從而non thread safety.使用double check來保證thread safe...