“阻塞”與"非阻塞"與"同步"與“異步"不能簡(jiǎn)單的從字面理解肖爵,提供一個(gè)從分布式系統(tǒng)角度的回答卢鹦。
1.同步與異步
同步和異步關(guān)注的是 消息通信機(jī)制 (synchronous communication/ asynchronous communication)。所謂同步劝堪,就是在發(fā)出一個(gè)*調(diào)用*時(shí)冀自,在沒有得到結(jié)果之前,該*調(diào)用*就不返回秒啦。但是一旦調(diào)用返回熬粗,就得到返回值了。
換句話說余境,就是由*調(diào)用者*主動(dòng)等待這個(gè)*調(diào)用*的結(jié)果驻呐。
而異步則是相反,*調(diào)用*在發(fā)出之后芳来,這個(gè)調(diào)用就直接返回了含末,所以沒有返回結(jié)果。換句話說即舌,當(dāng)一個(gè)異步過程調(diào)用發(fā)出后佣盒,調(diào)用者不會(huì)立刻得到結(jié)果。而是在*調(diào)用*發(fā)出后侥涵,*被調(diào)用者*通過狀態(tài)沼撕、通知來通知調(diào)用者,或通過回調(diào)函數(shù)處理這個(gè)調(diào)用芜飘。
舉個(gè)通俗的例子:
你打電話問書店老板有沒有《分布式系統(tǒng)》這本書务豺,如果是同步通信機(jī)制,書店老板會(huì)說嗦明,你稍等笼沥,”我查一下",然后開始查啊查娶牌,等查好了(可能是5秒奔浅,也可能是一天)告訴你結(jié)果(返回結(jié)果)。
而異步通信機(jī)制诗良,書店老板直接告訴你我查一下啊汹桦,查好了打電話給你,然后直接掛電話了(不返回結(jié)果)鉴裹。然后查好了舞骆,他會(huì)主動(dòng)打電話給你。在這里老板通過“回電”這種方式來回調(diào)径荔。
2. 阻塞與非阻塞
- 阻塞和非阻塞關(guān)注的是程序在等待調(diào)用結(jié)果(消息督禽,返回值)時(shí)的狀態(tài).
- 阻塞調(diào)用是指調(diào)用結(jié)果返回之前,當(dāng)前線程會(huì)被掛起总处。調(diào)用線程只有在得到結(jié)果之后才會(huì)返回狈惫。
非阻塞調(diào)用指在不能立刻得到結(jié)果之前,該調(diào)用不會(huì)阻塞當(dāng)前線程鹦马。
還是上面的例子
你打電話問書店老板有沒有《分布式系統(tǒng)》這本書胧谈,你如果是阻塞式調(diào)用,你會(huì)一直把自己“掛起”荸频,直到得到這本書有沒有的結(jié)果第岖,如果是非阻塞式調(diào)用,你不管老板有沒有告訴你试溯,你自己先一邊去玩了蔑滓, 當(dāng)然你也要偶爾過幾分鐘check一下老板有沒有返回結(jié)果。
在這里阻塞與非阻塞與是否同步異步無關(guān)遇绞。跟老板通過什么方式回答你結(jié)果無關(guān)键袱。
3. 舉一反三
背景: 老張愛喝茶,廢話不說摹闽,煮開水蹄咖。
出場(chǎng)人物:老張,水壺兩把(普通水壺付鹿,簡(jiǎn)稱水壺澜汤;會(huì)響的水壺蚜迅,簡(jiǎn)稱響水壺)。
1 老張把水壺放到火上俊抵,立等水開谁不。(同步阻塞)
老張覺得自己有點(diǎn)傻
2 老張把水壺放到火上,去客廳看電視徽诲,時(shí)不時(shí)去廚房看看水開沒有刹帕。(同步非阻塞)
老張還是覺得自己有點(diǎn)傻,于是變高端了谎替,買了把會(huì)響笛的那種水壺偷溺。水開之后,能大聲發(fā)出嘀~~~~的噪音钱贯。
3 老張把響水壺放到火上挫掏,立等水開。(異步阻塞)
老張覺得這樣傻等意義不大
4 老張把響水壺放到火上秩命,去客廳看電視砍濒,水壺響之前不再去看它了,響了再去拿壺硫麻。(異步非阻塞)
老張覺得自己聰明了爸邢。
所謂同步異步,只是對(duì)于水壺而言拿愧,即“調(diào)用的東西”杠河。
普通水壺,不響浇辜,但是最后水會(huì)開券敌,即到最后直接返回結(jié)果,同步通信機(jī)制柳洋;
響水壺待诅,水開了自己響通知老張,異步通信機(jī)制熊镣。
雖然都能干活卑雁,但響水壺可以在自己完工之后,提示老張水開了绪囱。這是普通水壺所不能及的测蹲。
同步只能讓調(diào)用者去輪詢自己(情況2中),造成老張效率的低下鬼吵。
所謂阻塞非阻塞扣甲,僅僅對(duì)于老張而言,老張相當(dāng)于程序齿椅。
立等的老張琉挖,就在那里等启泣,啥都沒干,阻塞示辈;
看電視的老張寥茫,干了別的事,非阻塞顽耳。
情況1和情況3中老張就是阻塞的坠敷,媳婦喊他都不知道妙同。雖然3中響水壺是異步的射富,可對(duì)于立等的老張沒有太大的意義。所以一般異步是配合非阻塞使用的粥帚,這樣才能發(fā)揮異步的效用胰耗。