dcl(double checked locking)
//class singleton
//:s1-
singleton* get_instance(void)
unlock();
return instance;
}
**存在的問題是:無論是否已經初始化都要加鎖,增加了負荷,已經沒有所謂的併發效能了。
//:s-2
singleton* get_instance(void)
return instance;
}
**存在的問題是:不能保證臨界區只初始化一次,沒能實現singleton的基本功能;
//:s-3
singleton* get_instance(void)
return instance;
}
**解決路上述問題——雙檢鎖模式,兼顧了效率和正確性。還來有人指出由於亂序執行的影響,dcl是靠不住的。
可以借助其他語言的一些機制,如eager initialization,memory barrier。
不過,如果支援pthread的話,可以站在巨人的肩膀,pthread_once
int pthread_once(pthread_once_t *once_control, void (*init_routine) (void));
功能:本函式使用初值為pthread_once_init的once_control變數保證init_routine()函式在本程序執行序列中僅執行一次。
在多執行緒程式設計環境下,儘管pthread_once()呼叫會出現在多個執行緒中,init_routine()函式僅執行一次,究竟在哪個執行緒中執行是不定的,是由核心排程來決定。
執行緒安全性由pthreads庫保證。
templateclass singleton:boost::noncopyable
private:
singleton();
~singleton();
static void init()
private:
static pthread_once_t ponce_;
static t* value_;
}//必須在標頭檔案中定義static 變數
templatepthread_once_t singleton::ponce_ = pthread_once_init;
templatet* singleton::value_ = null;
注意這裡沒有考慮物件銷毀
執行緒安全的單例模式(執行緒安全)示例
可以說單例模式是所有設計模式中最簡單的一種。單例模式就是說系統中對於某類的只能有乙個物件,不可能出來第二個。單例模式也是23中設計模式中在面試時少數幾個會要求寫 的模式之一。主要考察的是多執行緒下面單例模式的執行緒安全性問題。1.多執行緒安全單例模式例項一 不使用同步鎖 public class s...
執行緒安全的單例模式
廢話不多說,常用的 積澱下來。一 懶漢模式 即第一次呼叫該類例項的時候才產生乙個新的該類例項,並在以後僅返回此例項。需要用鎖,來保證其執行緒安全性 原因 多個執行緒可能進入判斷是否已經存在例項的if語句,從而non thread safety.使用double check來保證thread safe...
iOS執行緒安全單例詳解
只能生成乙個例項的類是實現了singleton模式的型別。由於設計模式在物件導向程式設計中起著舉足輕重的作用,在常用的模式中,singleton是唯一乙個能夠用短短幾十行 完整實現的模式。static pplaccountmanager sharedinstance nil 1.最簡單 非執行緒安全...