用兩個小例子來解釋單例模式中的「雙重鎖定」

2021-06-22 03:27:16 字數 1757 閱讀 3450

學習單例模式時,好多人都不太理解

雙重鎖定。學完後突然想到乙個很有趣的例子。

單例模式結構圖:

**:singleton類

class singleton

//用private修飾構造方法,防止外界利用new建立此類例項

public static singleton getinstance()

} //↑↑↑↑在同一時刻加了鎖的這部分程式只有乙個執行緒可以進入↑↑↑↑

} return instance;}}

客戶端**
static void main(string args)

說明:

《大話設計模式》中,小菜問道:「我在外面已經判斷了instance例項是否存在,為什麼在lock裡面還要做一次instance例項是否存在的判斷呢?」

大鳥是這麼回答的:當instance為null並且同時有兩個執行緒呼叫getinstance方法時,他們將都可以通過第一重instance==null的判斷。然後由於lock機制,這兩個執行緒則只有乙個進入,另外乙個在外排隊等候,必須要其中的乙個進入並出來後,另乙個才能進入,而此時如果沒有了第二重的instance是否為null的判斷,則第乙個執行緒建立了例項,第二個執行緒還是可以繼續再建立新的例項,這就沒有達到單例的目的。

如果覺得大鳥的話不太好理解,可以看看這個例子:

——如果我和你媽掉進河裡,你先救誰?——當然救我媽,寧願睡沙發!

在乙個200元時裝店(顧名思義,所有的衣服都是200元),媽媽看中一件200元的衣服,媳婦也看中一件200元的衣服,但我只有200塊錢(所以只能買一件),儘管如此,作為兒子和丈夫的我也得掏錢啊

。【ps:此處相當於**中的客戶端呼叫,singleton1為給老媽買衣服,singleton2為給媳婦買衣服】 

我走進商店時,跟店員說,我想買衣服,店員說:「那你有200快錢嗎?沒錢就趕緊出去!」。【ps:此處為第一層判斷】

經過深思熟慮,百善孝為先,我買了老媽看中的那件衣服。【給老媽買衣服的執行緒成功執行,給媳婦買衣服的執行緒被鎖在外面】

那媳婦的衣服怎麼辦?踱來踱去還想買另一件時,店員問我:「你有200塊錢嗎?沒錢就趕緊出去!」於是我出去了。【ps:第二層判斷,我沒錢了,所以出去了,今晚回去肯定又得睡沙發了t_t…t_t…t_t】

講完這個故事,突然又想到一件事,就再囉嗦幾句,爆爆料。

打倒花心大蘿蔔!

大家都聽說過darry ring鑽戒,它的宗旨是「用一生給你乙個唯一的承諾」,即乙個男人一生只能憑身份證買乙個。

話說幾十年前看上一位漂亮的女子,為了表達愛慕,為她買了一枚darry ring,女子被感動,順利追到手,當時還納悶為什麼買鑽戒還要填寫身份證號,不過也沒在意。

前幾天又看上一女子,於是花心的我想腳踏兩條船,想再買一枚darry ring追求之,麻煩來了,買鑽戒的時候,工作人員告訴我說,我已經買過darry ring的戒指,而

乙個男人一生只能憑身份證買一枚……我去!什麼鳥規定!於是忍痛揮淚和女神說拜拜t_t

override與new 用兩個小例子來解釋

例一 class program public class a5 public virtual void methodb public class b5 a5 例二 class a public virtual void aa class b a public override void aa 將這...

用小例子來解釋svn switch的使用

svn switch 的作用,不大好講清楚。用語言描述起來是 switch命令只是update命令的乙個超集。svn switch和svn update兩個命令唯一區別就是update會一直比較同一路徑。換名話說,update通過時間移動你的工作拷貝,switch通過時間和空間移動工作拷貝。本文的例...

用乙個小例子,來分析nodejs的非同步呼叫的順序

通過同步和非同步的對比,我們來看下nodejs是如何處理一些非同步呼叫的。下面是nodejs use strict const fs require fs 模擬非同步 console.time setout settimeout function 0 setimmediate function pr...