1. 程式人生 > >理解同步非同步與阻塞非阻塞的區別

理解同步非同步與阻塞非阻塞的區別

同步非同步與阻塞非阻塞的概念對於很多初學者來說是一個模糊的概念,其實我們的生活中存在著很多同步和非同步的例子。

同步和非同步關注的是訊息通訊機制

在計算機領域,同步就是指一個程序在執行某個請求的時候,若該請求需要一段時間才能返回資訊,那麼這個程序將會一直等待下去,直到收到返回資訊才繼續執行下去;非同步是指程序不需要一直等下去,而是繼續執行下面的操作,不管其他程序的狀態。當有訊息返回時系統會通知程序進行處理,這樣可以提高執行的效率。 

舉個通俗的例子:

你打電話問書店老闆有沒有《ECMAScript 6入門》這本書時

如果是同步通訊機制,書店老闆會說,你稍等,別掛電話,”我查一下",然後開始查啊查,等查好了(可能是1分鐘,也可能是一天)告訴你結果(返回結果)。在書店老闆查詢這個過程,你一直在等待他的回覆,這期間你不能去幹別的事情。

如果非同步通訊機制,書店老闆直接告訴你我查一下啊,查好了打電話給你,然後直接掛電話了(不返回結果)。然後查好了,他會主動打電話給你。在這裡老闆通過“回電”這種方式來回調。在書店老闆查詢這個過程,這期間你可以先去幹別的事情。

阻塞和非阻塞關注的是程式在等待呼叫結果(訊息,返回值)時的狀態.

阻塞呼叫:是指呼叫結果返回之前,當前執行緒會被掛起。一直處於等待訊息通知,不能夠執行其他業務,呼叫執行緒只有在得到結果之後才會返回。
非阻塞呼叫:指在不能立刻得到結果之前,該呼叫不會阻塞當前執行緒,而會立刻返回。

舉個通俗的例子:

同步阻塞:你打電話告訴老闆你要買《ECMAScript 6入門》這本書,老闆拿起電話聽你說完就去查書,沒有說話,你什麼也不知道,在得到任何結果之前,你一直拿著電話乾等,你此時什麼也幹不了。30分鐘後老闆直接把書送到你家,這時你才結束通話電話。每次電話你都要得到結果(書到家)後你才結束通話電話,這是同步。你一直拿著電話等結果,這是阻塞。

同步非阻塞

:你打電話告訴老闆你要買《ECMAScript 6入門》這本書,老闆拿起電話後說“我不知道有沒有貨,現在去查”便掛了電話,又過了10分種你第二次打電話說你要買《ECMAScript 6入門》這本書,老闆拿起電話說完“還沒有查到,你再等會兒”便結束通話電話。結束通話電話5分鐘後老闆查到有書,但並沒有主動打電話告訴你。你再次等待10分鐘後第三次電話老闆問結果,老闆說“書有了,我給你送到家”,你斷掛電話。每次電話你都要得得到結果(去查->還沒有查到->有貨)後你才結束通話電話,這是同步。你每隔10分鐘打電話詢問結果,這是非阻塞。

非同步阻塞:你打電話過去問老闆有沒有《ECMAScript 6入門》這本書,老闆說“我不知道有沒有貨,現在去查,先掛了電話,有結果告訴你,你等我電話”就掛掉電話。等電話期間你什麼也不幹,老闆主動給你發簡訊通知你結果書有了,5分鐘後希望老闆現在把書送來,你再次打電話讓老闆送書,老闆馬上送書上門。老闆主動給你發簡訊,這是非同步。等待老闆的簡訊期間你什麼也沒幹,這是阻塞。

非同步非阻塞
:你打電話過去後問老闆有沒有《ECMAScript 6入門》這本書,老闆說“好的,有貨我直接給你送上門”就掛掉電話。然後你想幹嘛幹嘛,等老闆門到後你看書。等待老闆主動給你送書上門,這是非同步。掛了電話後你就想幹嘛幹嘛,這是非阻塞。所以一般非同步是配合非阻塞使用的,這樣才能發揮非同步的效用。