要求:1.執行緒安全 2.效率高
double-check優化了每次呼叫加鎖的開銷。
static t* m_pinstance;
static t*
instance
(void)(
void
)omutex.
release()
;}return m_pinstance;
};
new 操作符不是原子操作。
new 操作符的執行過程:
呼叫operator new分配記憶體 ;
呼叫建構函式生成類物件;
返回相應指標。
**表示如下
1. t* tmp =
(t*)
malloc
(sizeof
(t))
;2. tmp-
>t::t(
);3. m_pinstance = tmp;
可能存在編譯器對**優化重排,編譯器可能先執行步驟1和3,這時候另外的執行緒去訪問m_pinstance,就會出現沒有構造或者構造未完成的狀態。
同第一種,沒有本質區別
static t* m_pinstance;
static t*
instance
(void)(
void
)omutex.
release()
;}return m_pinstance;
};
使用記憶體屏障,保證執行緒安全
static t* m_pinstance;
static t*
instance
(void)(
void
)omutex.
release()
;}return m_pinstance;
};
疑問點:第5行和第13行,乙個執行緒對指標寫,乙個執行緒對指標讀,而且讀的地方也沒有鎖,會不會出現讀到乙個不完整的指標的情況?
猜想可能是指標型別的大小與cpu位元組數相等。不存在一次寫一半讀一半的情況。存疑。
static t*
instance
(void);
c++11編譯器保證內部靜態變數是執行緒安全的。
還有一些例如pthread_once實現的單例模式不推薦使用。 單例模式 DoubleCheck
1.單例模式理解 是為了滿足一些場景,乙個物件只能建立乙個例項物件的場景。流程 1.構造方法私有化,2.宣告物件 位靜態 3.類方法返回例項化後的物件。2.將單例模式分為兩類 懶漢式和餓漢式 懶漢式 特點在定義singleton是就new public class singleton public ...
單例模式與double check
本文主要是講double check,通常double check比較少用,一般是在高併發的情況下。但是建議大家寫單例的時候都用上。單例模式分兩種 餓漢式與懶漢式,餓漢式是指在類載入時就進行例項化,而懶漢式是指在使用時才進行例項化。如下 餓漢式 public class singleton publ...
設計模式單例模式之double check
設計模式之雙重判定鎖 double check 下面列出乙個比較常用的也是我個人最喜歡的一種在多執行緒的情況下,又能滿足lazy loading,效率又高的一種單例模式的寫法 class singleton 在這可能有些小夥伴會問這個volatile這個是幹啥的,給出答案 volatile這個關鍵字...