天天看點

IO中同步與異步,阻塞與非阻塞差別

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

同步請求,A調用B,B的處理是同步的,在處理完之前他不會通知A,隻有處理完之後才會明确的通知A。

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

同步和異步最大的差別就是被調用方的執行方式和傳回時機。同步指的是被調用方做完事情之後再傳回,異步指的是被調用方先傳回,然後再做事情,做完之後再想辦法通知調用方。

阻塞請求,A調用B,A一直等着B的傳回,别的事情什麼也不幹。

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

阻塞調用是指調用結果傳回之前,目前線程會被挂起。函數隻有在得到結果之後才會傳回。

非阻塞:不能立刻得到結果之前,該函數不會阻塞目前線程,而會立刻傳回。

阻塞和非阻塞關注的是程式在等待調用結果(消息,傳回值)時的狀态.

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

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

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

我們是用傳統的水壺燒水。在水燒開之前我們一直做在水壺前面,等着水開。這就是阻塞的。

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

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

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

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

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

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模型。

擴充閱讀:你管這破玩意兒叫IO多路複用?

繼續閱讀