目錄
1. 懶漢式單例
1.1 單執行緒的懶漢式單例
1.2 多執行緒的懶漢式單例
1.3 使用靜態區域性變數的多執行緒懶漢式單例
2. 餓漢式單例
懶漢式單例在第一次被使用的時候才會進行例項化。
#include using namespace std;
class singleton
singleton(singleton&) = delete;
singleton& operator=(const singleton&) = delete;
public:
~singleton()
static singleton* getinstance()
return m_instance_ptr;
}private:
static singleton* m_instance_ptr;
};singleton* singleton::m_instance_ptr = nullptr;
int main()
上面這個單執行緒的單例問題比較多,首先會存在記憶體洩漏,然後再多執行緒環境下,可能有多個執行緒同時判斷「if (nullptr == m_instance_ptr)」為真,然後進入下面的語句,可能導致建立了多個例項。
對於記憶體洩漏的問題,我們進行如下修改:
class singleton
singleton(singleton&) = delete;
singleton& operator=(const singleton&) = delete;
//singleton退出時會自動析構gc,呼叫gc的析構函式,
//我們在gc的析構函式中釋放m_instance_ptr
class gc
} };
public:
~singleton()
static singleton* getinstance()
return m_instance_ptr;
}private:
static singleton* m_instance_ptr;
static gc gc;
};singleton* singleton::m_instance_ptr = nullptr;
singleton::gc singleton::gc;
在singleton類中增加了乙個gc巢狀類,並宣告了乙個static型別的gc的變數。當singleton結束的時候會呼叫gc類的析構函式,而在其析構函式中會使用delete釋放m_instance_ptr指向的記憶體,由此可以避免記憶體洩漏。
但是該方法在多執行緒環境下仍然是不安全的。
在多執行緒情況下,需要對共享資源進行加鎖,以保證其互斥訪問。我們可以再結合c++2.0的智慧型指標,將上述**修改一下。
#include #include #include using namespace std;
class singleton
singleton(singleton&) = delete;
singleton& operator=(const singleton&) = delete;
public:
typedef shared_ptrptr;
~singleton()
static ptr getinstance()
} return m_instance_ptr;
}private:
static ptr m_instance_ptr;
static mutex m_mutex;
};singleton::ptr singleton::m_instance_ptr = nullptr;
mutex singleton::m_mutex;
int main()
使用智慧型指標shard_ptr,解決了記憶體洩漏的問題,使用互斥量mutex和鎖管理器lock_guard實現了執行緒安全。
c++2.0保證了變數在初始化的時候如果併發同時進入了宣告語句,併發執行緒會阻塞等待宣告結束。
這可以保證併發執行緒在獲取靜態區域性變數的時候一定是初始化過的。
#include using namespace std;
class singleton
public:
~singleton()
singleton(singleton&) = delete;
singleton& operator=(const singleton&) = delete;
static singleton& getinstance()
};int main()
餓漢式單例,在載入時就進行初始化,而不是第一次引用時才進行初始化。因為是載入時就進行初始化,因此不存在多執行緒下建立多個例項的可能。
#include using namespace std;
class singleton
singleton(singleton&) = delete;
singleton& operator=(const singleton&) = delete;
//singleton退出時會自動析構gc,呼叫gc的析構函式,
//我們在gc的析構函式中釋放m_instance_ptr
class gc
} };
public:
static singleton* getinstance()
~singleton()
private:
static singleton* m_instance_ptr;
static gc gc;
};singleton* singleton::m_instance_ptr = new singleton;
singleton::gc singleton::gc;
int main()
這裡也可以使用智慧型指標來防止記憶體洩漏。 單例設計模式(餓漢單例設計模式 懶漢單例設計模式)
1.什麼是單例 單例的意思是乙個類永遠只存在乙個物件,不能建立多個物件。2.為什麼要用單例 開發中有很多的物件我們只需要乙個,例如虛擬機器物件,任務管理器物件 物件越多越佔記憶體,有時候只需要乙個物件就可以實現業務,單例可以節省記憶體空間。3.如何實現單例 單例的實現方式有 餓漢單例設計模式 通過類...
設計模式 單例設計模式
歷史 最早是建築學領域的模式,然後gof四人由其引申到編碼方面,總結了23種設計模式 設計模式 解決某一類事情最行之有效的方法 2.1 體現 餓漢式,保證物件的唯一性 class singleton 私有化建構函式禁止該類建立物件 private static singleton st new si...
設計模式 單例設計模式
單例模式,是一種常用的軟體設計模式。在它的核心結構中只包含乙個被稱為單例的特殊類。通過單例模式可以保證系統中乙個類只有乙個例項。即乙個類只有乙個物件例項 單例模式的要點有三個 一是某個類只能有乙個例項 二是它必須自行建立這個例項 三是它必須自行向整個系統提供這個例項。單例設計模式 解決的問題 可以保...