單例模式與call once

2021-10-09 04:29:04 字數 1646 閱讀 3384

單例模式的概念:

整個專案中,有某個或者某些特殊的類,只能建立乙個屬於該類的物件。

下面是單例類的實現**:

#include using namespace std;

class a

static a* m_a;

public:

static a* getinstance()

return m_a;

} //釋放物件

class b

} };

void func()

};//靜態成員的初始化操作

a* a::m_a = null;

void main()

1.將類的建構函式設定為私有的,同時申請靜態成員函式(公有)和靜態成員變數(私有);

2.怎麼釋放申請的單例類物件的記憶體呢,在類中巢狀乙個類物件,在巢狀的類物件中析構函式中 釋放申請的變數。(將巢狀類物件放在大類的靜態成員函式中(以靜態物件存在哦!確保物件是在程式執行結束後釋放的));

當單例碰到了多執行緒,會有什麼問題,比如兩個執行緒中同時訪問getinstance(),這就會出現問題,會同時建立多個物件????

那解決措施自然 會想到 互斥量來鎖一下來解決這個問題!

getinstance()函式是只是初始化會被呼叫一次的,所以如下的操作不太行,效率不行!

#include #include using namespace	std;

mutex mymutex;

//懶漢模式

class singelton

return instance;

}private:

singelton() {}

static singelton *instance;

};singelton * singelton::instance = null;

所以就有了雙重鎖定解決效率問題!

#include #include using namespace	std;

mutex mymutex;

class singelton

} return instance;

}private:

singelton() {}

static singelton *instance;

};singelton * singelton::instance = null;

這樣算是解決了問題!

同樣的c++11給我們提供了乙個解決方案 std::call_once 當然要結合std::once_flage 一起,具體操作就是  將只要初始化一次的語句,寫入乙個函式中,在呼叫這對類std 解決;**如下:

once_flag g_flag;

class singelton

//兩個執行緒同時執行到這裡,其中乙個執行緒要等另外乙個執行緒執行完畢

static singelton * getinstance()

private:

singelton() {}

static singelton *instance;

};singelton * singelton::instance = null;

部分 ** 參考部落格:

單例模式 單例模式

餓漢式 急切例項化 public class eagersingleton 2.宣告靜態成員變數並賦初始值 類初始化的時候靜態變數就被載入,因此叫做餓漢式 public static eagersingleton eagersingleton new eagersingleton 3.對外暴露公共的...

單例模式與多例模式

共同點 建構函式私有化 有什麼用?單例設計模式的特點 多例設計模式 多例設計模式和單例一樣都需要建構函式私有化,多例是根據不同的需求返回多個單例中的指定值。a code block public class message 餓漢式 class singletonhungry 構造方法私有化 publ...

設計模式與單例模式

1.是在大量的事件中總結和理論化之後優選的 結構,程式設計風格 以及解決問題的思考方式。2.經典的設計模式有23種 1.採取一定的方法保證在整個軟體系統中,對某個類只能存在乙個物件例項 2.餓漢式 class bank 2.內部建立當前類的例項 private static bank bank ne...