同步和異步,阻塞和非阻塞是大家經常會聽到的概念,但是它們是從不同維度來描述一件事情,常常很容易混為一談,
1. 同步和異步
同步和異步描述的是訊息通信的機制,
同步
當一個request發送出去以后,會得到一個response,這整個程序就是一個同步呼叫的程序,哪怕response為空,或者response的回傳特別快,但是針對這一次請求而言就是一個同步的呼叫,
異步
當一個request發送出去以后,沒有得到想要的response,而是通過后面的callback、狀態或者通知的方式獲得結果,可以這么理解,對于異步請求分兩步:1)呼叫方發送request沒有回傳對應的response(可能是一個空的response);2)服務提供方將response處理完成以后通過callback的方式通知呼叫方,對于1)而言是同步操作(呼叫方請求服務方),對于2)而言也是同步操作(服務方回掉呼叫方),從請求的目的(呼叫方發送一個request,希望獲得對應的response)來看,這兩個步驟拆分開來沒有任何意義,需要結合起來看,而這整個程序就是一次異步請求,異步請求有一個最典型的特點:需要callback、狀態或者通知的方式來告知呼叫方結果,
2. 阻塞和非阻塞
阻塞和非阻塞描述的是程式在等待呼叫結果(訊息,回傳值)時的狀態,
阻塞
阻塞呼叫是指呼叫方發出request的執行緒因為某種原因(如:等待系統資源)被服務方掛起,當服務方得到response后就喚醒掛起執行緒,并將response回傳給呼叫方,
非阻塞
非阻塞呼叫是指呼叫方發出request的執行緒在沒有等到結果時不會被掛起,直到得到response后才回傳,
阻塞和非阻塞最大的區別就是看呼叫方執行緒是否會被掛起,
3. 同步、異步、阻塞和非阻塞IO
同步阻塞IO

針對Sender而言,請求發送出去以后,一直等到Receiver有結果了才回傳,這是同步,在Sender獲取結果的期間一直被block住了,也就是在此期間Sender不能處理其它事情,這是阻塞,
異步阻塞IO

針對Sender而言,請求發送出去以后,立刻回傳,然后再等待Receiver的callback,最后再次請求獲取response,這整個程序是異步,在Sender等待Receiver的callback期間一直被block住了,也就是在此期間Sender不能處理其它事情,這是阻塞,
同步非阻塞IO

針對Sender而言,請求發送出去以后,立刻回傳,然后再不停的發送請求,直到Receiver處理好結果后,最后一次發請求給Receiver才獲得response,Sender一直在主動輪詢,每一個請求都是同步的,整個程序也是同步的,在Sender等待Receiver的response期間一直是可以處理其它事情的(比如:可以發送請求詢問結果),這是非阻塞,
異步非阻塞IO

針對Sender而言,請求發送出去以后,立刻回傳,然后再等待Receiver的callback,最后再次請求獲取response,這整個程序是異步,在Sender等待Receiver的callback期間一直是可以處理其它事情的,這是非阻塞,
總結
- 同步和異步就看呼叫方是否需要通過callback、通知或者狀態來獲取結果
- 阻塞和非阻塞就看呼叫方在發送請求后是否block住了
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/145083.html
標籤:Java
上一篇:spring cloud入門
