同步和異步關注的是消息通信機制 (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多路複用?