基於執行緒安全的單例模式

2021-06-06 15:54:07 字數 974 閱讀 4894

今天被問到單例模式了,之前沒有很關注執行緒安全問題,結果悲劇了。這裡主要有兩個問題:

1) 加鎖

2) 要粒度細,也就是說盡量鎖最少的**

所以我們必須加鎖,而且只要鎖住new就可以了,不要在if判斷之前鎖。但是這裡有出現乙個問題就是,如果我們僅僅鎖住new的話,偽**如下

testobj * getinstance()

if(m_instance ==null)

lock

m_instance =  new testobj();

unlock

那麼假如有兩個執行緒(a和b)同時呼叫getinstance,兩個都通過了if的判斷,從而開始競爭鎖,比如a先得到鎖資源,那麼m_instance 會被new出來,然後釋放鎖,接著b得到鎖,接著又去new了一把,其實這個時候m_instance已經存在了,不用new了。所以我們要用double check

另外對m_instance的初始化時單例模式很重要的乙個部分

#include

#include

class clocks

~clocks()

void lock()

void unlock()

};class a

a(a&){}

a& operator=(const a&);

static clocks m_lock;

public:

static a* getinstance()

m_lock.unlock();

}return m_instance;}};

//初始化很重要的啊

clocks a::m_lock;

a* a::m_instance = null;

int main( ) 

{ a * pa = a::getinstance();

return 0; 

c++完美實現singleton模式  寫得很好的一篇文章

執行緒安全的單例模式

廢話不多說,常用的 積澱下來。一 懶漢模式 即第一次呼叫該類例項的時候才產生乙個新的該類例項,並在以後僅返回此例項。需要用鎖,來保證其執行緒安全性 原因 多個執行緒可能進入判斷是否已經存在例項的if語句,從而non thread safety.使用double check來保證thread safe...

執行緒安全的單例模式

單例模式是為了保證乙個類只有乙個例項而且易於外界訪問。所以一般只有把建構函式,拷貝函式,析構函式,賦值函式,變數名變為私有。再用乙個get函式訪問提供介面即可。考慮執行緒安全就要加鎖。一 懶漢模式 1 靜態成員例項的懶漢模式 class singleton public static singlet...

執行緒安全的單例模式

在我們專案中,很多時候需要程式只存在乙個唯一例項。通常在專案中我會把單例模式寫成如下形式 public class singleton public static singleton getinstance return msingleton 通常以這種形式返回乙個類的唯一例項,然而在android...