C 單例模式(懶漢和餓漢)與執行緒安全

2021-07-30 13:34:13 字數 1216 閱讀 1632

單例:

單例大約有兩種實現方法:懶漢與餓漢。

懶漢:故名思義,不到萬不得已就不會去例項化類,也就是說在第一次用到類例項的時候才會去例項化,

餓漢:餓了肯定要飢不擇食。所以在單例類定義的時候就進行例項化。

(1)餓漢

餓漢單例,即在最開始的時候,靜態物件就已經建立完成;

設計方法是類中包含乙個靜態成員指標,該指標指向該類的乙個物件,提供乙個公有的靜態成員方法,返回該物件指標;為了使得物件唯一,還需要將建構函式設為私有,**如下:

class sigletion

static singleton* p;

static pthread_mutex_t mutex;

public:

static singleton* initance()

pthread_mutex_unlock(&mutex);

return p;

}};pthread_mutex_t singleton::mutex;

singleton* singleton::p = null;

那麼我們這樣寫的**是沒有問題的,但是效率可能有點低,因為加鎖是乙個非常耗時的操作,沒有必要每次都要加鎖解鎖,只有剛開始建立物件的時候需要加鎖。如果物件都

建立出來了,就沒必要加鎖解鎖了,直接返回這個物件的指標。

class singleton

static singleton* p;

static pthread_mutex_t mutex;

public:

static singleton* initance()

pthread_mutex_unlock(&mutex);

} return p;

}};pthread_mutex_t singleton::mutex;

singleton* singleton::p = null;

允許可變數目的例項,基於單例模式我們可以擴充套件,使用與單例控制相似的方法來獲得指定個數的物件例項。(即單例類內有多個靜態物件指標成員,每次當單例類被引用時隨機分配乙個例項物件);

單例模式的適用場景

(1)系統只需要乙個例項物件,或者考慮到資源消耗的太大而只允許建立乙個物件。

(2)客戶呼叫類的單個例項只允許使用乙個公共訪問點,除了該訪問點之外不允許通過其它方式訪問該例項 (就是共有的靜態方法)。

單例模式與執行緒安全單例模式(懶漢 餓漢)

直接就可以在靜態區初始化instance,然後通過getinstance返回,這種就被稱為餓漢式單例類。也有些寫法是在getinstance中new instance然後返回,這種就被稱為懶漢式單例類,但這涉及到第一次getinstance的乙個判斷問題。單例大約有兩種實現方法 懶漢與餓漢。懶漢 故...

C 的單例模式與執行緒安全單例模式(懶漢 餓漢)

1 教科書裡的單例模式 我們都很清楚乙個簡單的單例模式該怎樣去實現 建構函式宣告為private或protect防止被外部函式例項化,內部儲存乙個private static的類指標儲存唯一的例項,例項的動作由乙個public的類方法代勞,該方法也返回單例類唯一的例項。上 1 2 3 4 5 6 7...

C 的單例模式與執行緒安全單例模式(懶漢 餓漢)

單例模式 是一種常用的軟體設計模式。在它的核心結構中只包含乙個被稱為單例的特殊類。通過單例模式可以保證系統中乙個類只有乙個例項。即乙個類只有乙個物件例項。實現簡單的單例模式 建構函式宣告為private或protect防止被外部函式例項化,內部儲存乙個private static的類指標儲存唯一的例...