同步/異步和阻塞/非阻塞
title: 同步/異步和阻塞/非阻塞
date: 2018-08-15 14:52:26
tags: [後端技術,system]
categories: JAVA
---
本文部分摘錄
怎樣理解阻塞非阻塞與同步異步的區別? - 嚴肅的回答 - 知乎
阻塞”與"非阻塞"與"同步"與“異步"不能簡單的從字面理解,提供一個從分布式系統角度的回答。
阻塞”與"非阻塞"與"同步"與“異步"
同步與異步同步和異步關註的是消息通信機制 ## (synchronous communication/ asynchronous communication)
所謂同步,就是在發出一個調用時,在沒有得到結果之前,該調用就不返回。但是一旦調用返回,就得到返回值了。換句話說,就是由調用者
阻塞與非阻塞阻塞和非阻塞關註的是程序在等待調用結果(消息,返回值)時的狀態.
阻塞調用是指調用結果返回之前,當前線程會被掛起。調用線程只有在得到結果之後才會返回。非阻塞調用指在不能立刻得到結果之前,該調用不會阻塞當前線程。還是上面的例子,你打電話問書店老板有沒有《分布式系統》這本書,你如果是阻塞式調用,你會一直把自己“掛起”,直到得到這本書有沒有的結果,如果是非阻塞式調用,你不管老板有沒有告訴你,你自己先一邊去玩了, 當然你也要偶爾過幾分鐘check一下老板有沒有返回結果。在這裏阻塞與非阻塞與是否同步異步無關。跟老板通過什麽方式回答你結果無關。
以上為該答主的阻塞/非阻塞和異步/同步的理解。
結論
綜上所述(個人簡單的理解):
同步阻塞是兩種不同層次上程序的執行方式
同步和異步的區別在於是否需要調用方去check結果,同步需要調用方主動去check(不論是否需要等待結果,如果需要一直等待則是阻塞同步,如果每隔一段時間去check則是非阻塞同步);異步則是調用方本身不關心程序何時調用成功,在執行調用後去做別的事情了,而是被調用方通過(一般是發送flag等標誌位告知)再讓調用發去check。
阻塞和非阻塞實際上是程序是否獲取到結果,非阻塞在沒有收到結果的情況下繼續執行,並設置時間閾值去check(通常情況下是這麽操作的),阻塞則需要一直等待調用結果。
PS:之前對異步阻塞一直很困惑,後來有所理解,即調用方在執行調用後,不去care等待,直接返回,等被調用方進行通知,在這段等待通知的時間內,調用線程不做任何別的事,必須在得到被調用放通知其調用結果後才能繼續執行(不知道描述是否清楚)。
本人還不知道我文中的特殊情況下是怎麽樣實現的,如果有同學知道,歡迎郵件討論。
同步/異步和阻塞/非阻塞