1. 程式人生 > >同步/異步和阻塞/非阻塞

同步/異步和阻塞/非阻塞

通知 摘錄 sync 程序 如果 date 不返回 個人 非阻塞


title: 同步/異步和阻塞/非阻塞
date: 2018-08-15 14:52:26
tags: [後端技術,system]
categories: JAVA
---
本文部分摘錄
怎樣理解阻塞非阻塞與同步異步的區別? - 嚴肅的回答 - 知乎

阻塞”與"非阻塞"與"同步"與“異步"不能簡單的從字面理解,提供一個從分布式系統角度的回答。

阻塞”與"非阻塞"與"同步"與“異步"

同步與異步同步和異步關註的是消息通信機制 ## (synchronous communication/ asynchronous communication)

所謂同步,就是在發出一個調用時,在沒有得到結果之前,該調用就不返回。但是一旦調用返回,就得到返回值了。換句話說,就是由調用者

主動等待這個調用的結果。而異步則是相反,調用在發出之後,這個調用就直接返回了,所以沒有返回結果。換句話說,當一個異步過程調用發出後,調用者不會立刻得到結果。而是在調用發出後,被調用者通過狀態、通知來通知調用者,或通過回調函數處理這個調用。典型的異步編程模型比如Node.js舉個通俗的例子:你打電話問書店老板有沒有《分布式系統》這本書,如果是同步通信機制,書店老板會說,你稍等,”我查一下",然後開始查啊查,等查好了(可能是5秒,也可能是一天)告訴你結果(返回結果)。而異步通信機制,書店老板直接告訴你我查一下啊,查好了打電話給你,然後直接掛電話了(不返回結果)。然後查好了,他會主動打電話給你。在這裏老板通過“回電”這種方式來回調。

阻塞與非阻塞阻塞和非阻塞關註的是程序在等待調用結果(消息,返回值)時的狀態.

阻塞調用是指調用結果返回之前,當前線程會被掛起。調用線程只有在得到結果之後才會返回。非阻塞調用指在不能立刻得到結果之前,該調用不會阻塞當前線程。還是上面的例子,你打電話問書店老板有沒有《分布式系統》這本書,你如果是阻塞式調用,你會一直把自己“掛起”,直到得到這本書有沒有的結果,如果是非阻塞式調用,你不管老板有沒有告訴你,你自己先一邊去玩了, 當然你也要偶爾過幾分鐘check一下老板有沒有返回結果。在這裏阻塞與非阻塞與是否同步異步無關。跟老板通過什麽方式回答你結果無關。
以上為該答主的阻塞/非阻塞和異步/同步的理解。

結論

綜上所述(個人簡單的理解):
同步阻塞是兩種不同層次上程序的執行方式

同步和異步的區別在於是否需要調用方去check結果,同步需要調用方主動去check(不論是否需要等待結果,如果需要一直等待則是阻塞同步,如果每隔一段時間去check則是非阻塞同步);異步則是調用方本身不關心程序何時調用成功,在執行調用後去做別的事情了,而是被調用方通過(一般是發送flag等標誌位告知)再讓調用發去check。

阻塞和非阻塞實際上是程序是否獲取到結果,非阻塞在沒有收到結果的情況下繼續執行,並設置時間閾值去check(通常情況下是這麽操作的),阻塞則需要一直等待調用結果。

PS:之前對異步阻塞一直很困惑,後來有所理解,即調用方在執行調用後,不去care等待,直接返回,等被調用方進行通知,在這段等待通知的時間內,調用線程不做任何別的事,必須在得到被調用放通知其調用結果後才能繼續執行(不知道描述是否清楚)。
本人還不知道我文中的特殊情況下是怎麽樣實現的,如果有同學知道,歡迎郵件討論。

同步/異步和阻塞/非阻塞