前言
在實際的開發(fā)中,我們經(jīng)常會聽到同步哗伯,異步焊刹,阻塞恳蹲,非阻塞這些編程概念,每次遇到的時候都會蒙圈贺奠,然后就各種查網(wǎng)上似是而非的資料荆针,結(jié)果越查越迷糊,大部分文章都千篇一律喉悴,沒有說到本質(zhì)上的區(qū)別箕肃,所以下次再碰到這些概念今魔,印象還是比較模糊,尤其是在一些場景下同步與阻塞吟宦,異步與非阻塞感覺沒啥區(qū)別涩维,但其實這四個術(shù)語描述的事物還真不是一回事瓦阐。
下面我們來慢慢探討他們之間的區(qū)別與聯(lián)系,在這之前踏幻,我們還會經(jīng)炒辽保看到下面的組合術(shù)語:
(一)同步+阻塞
(二)同步+非阻塞
(三)異步+阻塞
(四)異步+非阻塞
在當(dāng)什么是同步和異步夭苗,阻塞與非阻塞的概念還沒弄清楚之前听诸,更別提上面這些組合術(shù)語了晌梨,只會讓你更加困惑须妻。
關(guān)于同步和異步
同步和異步其實指的是,請求發(fā)起方對消息結(jié)果的獲取是主動發(fā)起的敛惊,還是等被動通知的绰更。如果是請求方主動發(fā)起的,一直在等待應(yīng)答結(jié)果(同步阻塞)特恬,或者可以先去處理其他的事情癌刽,但要不斷輪詢查看發(fā)起的請求是否有應(yīng)答結(jié)果(同步非阻塞 )因為不管如何都要發(fā)起方主動獲取消息結(jié)果尝丐,所以形式上還是同步操作。如果是由服務(wù)方通知的远荠,也就是請求方發(fā)出請求后失息,要么在一直等待通知(異步阻塞),要么就先去干自己的事了(異步非阻塞),當(dāng)事情處理完成之后辰晕,服務(wù)方會主動通知請求方,它的請求已經(jīng)完成含友,這就是異步替裆。異步通知的方式一般是通過狀態(tài)改變,消息通知宜咒,或者回調(diào)函數(shù)來完成把鉴,大多數(shù)時候采用的都是回調(diào)函數(shù)。
關(guān)于阻塞和非阻塞
阻塞和非阻塞在計算機(jī)的世界里面场晶,通常指的是針對IO的操作怠缸,如網(wǎng)絡(luò)IO和磁盤IO等。那么什么是阻塞和非阻塞呢揭北?簡單的說就是我們調(diào)用了一個函數(shù)之后,在等待這個函數(shù)返回結(jié)果之前恨樟,當(dāng)前的線程是處于掛起狀態(tài)厌杜,還是運行狀態(tài)计螺,如果是掛起狀態(tài),就意味著當(dāng)前線程什么都不能干登馒,就等著獲取結(jié)果陈轿,這就叫同步阻塞,如果仍然是運行狀態(tài)蛾娶,就意味當(dāng)前線程是可以的繼續(xù)處理其他任務(wù)潜秋,但要時不時的去看下是否有結(jié)果了,這就是同步非阻塞罗售。
實際生活場景
同步,異步穆碎,阻塞和非阻塞职恳,會組合成上面提到過的四種結(jié)果:
(一)同步+阻塞
(二)同步+非阻塞
(三)異步+阻塞
(四)異步+非阻塞
舉個例子,比如我們?nèi)フ障囵^拍照话肖,拍完照片之后最筒,商家說需要30分鐘左右才能洗出來照片,
這個時候如果我們一直在店里面啥都不干辙培,一直等待商家面前等待它洗完照片邢锯,這個過程就叫同步阻塞。
當(dāng)然大部分人很少這么干尾抑,更多的是大家拿起手機(jī)開始看電視再愈,看一會就會問老板洗完沒护戳,老板說沒洗完媳荒, 然后我們接著看,再過一會接著問钳枕,直到照片洗完,這個過程就叫同步非阻塞疟暖。
因為店里生意太好了,越來越多的人過來拍,店里面快沒地方坐了欣舵,老板說你把你手機(jī)號留下缀磕,我一會洗好了就打電話告訴你過來取,然后你去外面找了一個長凳開始躺著睡覺等待老板打電話糟把,啥不都干,這個過程就叫異步阻塞遣疯。
當(dāng)然實際情況是缠犀,大家可能會直接先去逛街或者吃飯做其他的活動,這樣以來兩不耽誤辨液,這個過程就叫異步非阻塞滔迈。
總結(jié)
本文主要介紹了同步被辑,異步,阻塞和非阻塞的相關(guān)概念和例子间涵,從上面的描述中我們其實能夠看到阻塞和非阻塞通常是指客戶端在發(fā)出請求后勾哩,在服務(wù)端處理這個請求的過程中举哟,客戶端本身是否直接掛起等待結(jié)果,還是繼續(xù)做其他的任務(wù)潜叛。而異步和同步,則是對于請求結(jié)果的獲取是客戶端主動等待獲取销斟,還是由服務(wù)端來通知消息結(jié)果蚂踊。從這一點來看同步和阻塞其實描述的兩個不同角度的事情笔宿,阻塞和非阻塞指的一個是客戶端等待消息處理時的本身的狀態(tài)泼橘,是掛起還是繼續(xù)干別的。同步和異步指的對于消息結(jié)果的獲取是客戶端主動獲取醋粟,還是由服務(wù)端間接推送昔穴。記住這兩點關(guān)鍵的區(qū)別將有助于我們更好的區(qū)分和理解它們提前。