1. 程式人生 > 程式設計 >簡述JAVA同步、非同步、阻塞和非阻塞之間的區別

簡述JAVA同步、非同步、阻塞和非阻塞之間的區別

同步和非同步,阻塞和非阻塞是大家經常會聽到的概念,但是它們是從不同維度來描述一件事情,常常很容易混為一談。

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

簡述JAVA同步、非同步、阻塞和非阻塞之間的區別

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

非同步阻塞IO

簡述JAVA同步、非同步、阻塞和非阻塞之間的區別

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

同步非阻塞IO

簡述JAVA同步、非同步、阻塞和非阻塞之間的區別

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

非同步非阻塞IO

簡述JAVA同步、非同步、阻塞和非阻塞之間的區別

針對Sender而言,請求傳送出去以後,立刻返回,然後再等待Receiver的callback,最後再次請求獲取response,這整個過程是非同步。在Sender等待Receiver的callback期間一直是可以處理其它事情的,這是非阻塞。

總結

  • 同步和非同步就看呼叫方是否需要通過callback、通知或者狀態來獲取結果
  • 阻塞和非阻塞就看呼叫方在傳送請求後是否block住了

以上就是簡述JAVA同步、非同步、阻塞和非阻塞之間的區別的詳細內容,更多關於JAVA同步、非同步、阻塞和非阻塞的區別的資料請關注我們其它相關文章!