IO中同步與異步,阻塞與非阻塞區別(轉)

同步和異步關注的是消息通訊機制 (synchronous communication/asynchronous communication)異步

同步請求,A調用B,B的處理是同步的,在處理完以前他不會通知A,只有處理完以後纔會明確的通知A。async

異步請求,A調用B,B的處理是異步的,B在接到請求後先告訴A我已經接到請求了,而後異步去處理,處理完以後經過回調等方式再通知A。函數

同步和異步最大的區別就是被調用方的執行方式和返回時機。同步指的是被調用方作完事情以後再返回,異步指的是被調用方先返回,而後再作事情,作完以後再想辦法通知調用方。.net

 

阻塞請求,A調用B,A一直等着B的返回,別的事情什麼也不幹。線程

非阻塞請求,A調用B,A不用一直等着B的返回,先去忙別的事情了。blog

阻塞調用是指調用結果返回以前,當前線程會被掛起。函數只有在獲得結果以後纔會返回。同步

非阻塞:不能馬上獲得結果以前,該函數不會阻塞當前線程,而會馬上返回。io

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

 

同步是個過程,阻塞是線程的一種狀態。程序

同步、異步說的是被調用者會不會通知,阻塞、非阻塞說的是調用者會不會卡住不動。

 

先來看同步(普通水壺)場景中是如何包含阻塞和非阻塞狀況的。

咱們是用傳統的水壺燒水。在水燒開以前咱們一直作在水壺前面,等着水開。這就是阻塞的。

咱們是用傳統的水壺燒水。在水燒開以前咱們先去客廳看電視了,可是水壺不會主動通知咱們,須要咱們時不時的去廚房看一下水有沒有燒開。這就是非阻塞的。

 

再來看異步(有提醒功能的水壺)場景中是如何包含阻塞和非阻塞狀況的

咱們是用帶有提醒功能的水壺燒水。在水燒發出提醒以前咱們一直作在水壺前面,等着水開。這就是阻塞的。

咱們是用帶有提醒功能的水壺燒水。在水燒發出提醒以前咱們先去客廳看電視了,等水壺發出聲音提醒咱們。這就是非阻塞的。

阻塞非阻塞說的是我,同步異步說的是水壺。

 

Java中的三種IO模型

在Java語言中,一共提供了三種IO模型,分別是阻塞IO(BIO)、非阻塞IO(NIO)、異步IO(AIO)。

這裏面的BIO和NIO都是同步的IO模型,即同步阻塞IO和同步非阻塞IO,異步IO指的是異步非阻塞IO。

BIO (Blocking I/O):同步阻塞I/O模式,數據的讀取寫入必須阻塞在一個線程內等待其完成。

NIO (New I/O):同時支持阻塞與非阻塞模式,但主要是使用同步非阻塞IO。

AIO (Asynchronous I/O):異步非阻塞I/O模型。原文:https://blog.csdn.net/qq_35642036/article/details/82798722 

相關文章
相關標籤/搜索