C 單例模式簡複習 餓漢式,懶漢式執行緒安全

2021-09-25 04:57:24 字數 3395 閱讀 8026

單例模式,顧名思義,即乙個類只有乙個例項物件。

餓漢式寫法全域性只有乙個已經建立好的靜態物件,每次要用時就返回這個物件的引用就行,餓漢式在多執行緒裡面同時getinstance()去獲取這個物件的時候,是不存在安全問題的,餓漢式寫法如下:

#include

using

namespace std;

class

student;~

student()

;int age;

student

(const student &);

//把這個拷貝構造和下一行的操作符過載設為私有,沒必要實現

student&

operator=(

const student &);

//這樣就能防止物件被拷貝

static student myinstance;

// 單例物件在這裡!

public

:static student*

getinstance()

void

printage()

};//靜態物件記得初始化哦,不然會報錯undefined reference to `student::myinstance'

懶漢式和上面餓漢式的區別是:餓漢式是程式執行時一開始就構造了乙個全域性物件,要用的時候去拿就行了。而懶漢式是第一次要用到的時候才去new生成這個物件(所以比較懶),之後獲取的也是第一次new構造出來的物件指標

同時我們的指標new完之後,在程式結束時,我們需要釋放掉這個指標指向的記憶體,這裡同比較常見方法:定義乙個內部類,這個內部類析構時,,輔助他釋放指標記憶體

#include

using

namespace std;

class

student;~

student()

;student

(const student &);

//設定拷貝構造和操作符=過載防止物件拷貝

student&

operator=(

const student &);

int age;

static student *myinstance;

// 這裡是物件指標,不是乙個例項化物件了

public

:static student*

getinstance()

return myinstance;

//返回物件指標

}void

printage()

private

:// 定義乙個內部類

class

cgarbo

;// 定義乙個內部類的靜態物件

static cgarbo m_garbo;

~cgarbo()

//物件程式結束析構時對主類指標釋放記憶體}}

;};//記得要初始化靜態物件,裡面只是定義了他,沒有分配記憶體空間

不知道大家注意到懶漢式上面的這一段**了嗎

static student*

getinstance()

return myinstance;

//返回物件指標

}

這段**在多執行緒中,比如兩個執行緒,剛好同時執行到if(myinstance==nullptr)的話,兩個執行緒都是判斷myinstance為空,然後就會兩次new操作,這樣就生成了兩個物件,就不是單例模式了。

但是我們可以加入#include<mutex>,然後生成mutex mylock鎖,在執行到這段的時候

static student*

getinstance()

return myinstance;

//返回物件指標

}

這樣加鎖之後,能確保只有乙個物件,但是這樣還不夠好,如果執行緒非常多的話,頻繁加鎖解鎖是效率很低下的。所以對這個懶漢式進行一定的改造全域性**如下:

#include

#include

//多執行緒標頭檔案

#include

using

namespace std;

//建立全域性鎖

mutex mylock;

class

student

;student

(const student &);

student&

operator=(

const student &);

~student()

;static student *myinstance;

int age;

public

:static student *

getinstance()

}return myinstance;

}void

printage()

private

:// 定義乙個內部類

class

cgarbo;~

cgarbo()

}};// 定義乙個內部類的靜態物件

這次對前面的知識重新複習一下收益良多,大家一起學習進步;

單例模式(餓漢式 懶漢式)

2.餓漢式 立即載入 3.懶漢式 延遲載入 定義 單例模式確保某乙個類只有乙個例項,而且自行例項化並向整個系統提供這個例項,這個類稱為單例類,它提供全域性訪問的辦法。單例模式的要點有兩個 public class singleton 靜態方法,可以加入自定義控制,保證只產生乙個例項 public s...

單例模式 懶漢式 餓漢式

單例 1 訪問頻率高適合做成單例 2 這個類本身就是要描述乙個物件,就是想產生乙個物件就夠了,這樣的情況也是需要維護成乙個物件就ok 了 1 物件訪問高 建立物件不寄存客戶資料 適合 建立物件寄存客戶資料 不適合 第一步 把構造器變成私有的 構造器私有化 就是在別的地方new不成 靜態成員可以直接用...

單例模式(餓漢式 懶漢式)

所謂類的單例設計模式,就是採取一定的方法保證在整個的軟體系統中,對某個類只能存在乙個物件例項,並且該類只提供乙個取得其物件例項的方法。public class singleton 靜態方法返回例項 public static singleton getstingleton 這種方式是執行緒安全的 p...