你真的理解同步異步和阻塞非阻塞嗎?
同步、異步、阻塞、非阻塞都是和IO(輸入輸出)有關的概念。最簡單的文件讀取就是IO操作。而在文件讀取這件事兒上,可以有多種方式。
怎么理解同步,異步和阻塞,非阻塞?
那我先講下同步異步和阻塞非阻塞這兩大塊之間的區別?
他們針對的對象不同,好比A調用B,同步異步針對的是被調用者也就是B,阻塞非阻塞針對的是調用者也就是A。
然后我們再來講一下什么是同步和異步?
A調用B,同步異步針對得是調用方B
如果是同步的話,B處理完后有結果了才通知A.
如果是異步的話,B在接到請求后先告訴A我已經接到請求了,然后有結果后再通過callback、通知或者狀態等方式再通知A。
同步和異步最大的區別就是被調用方B的執行方式和返回時機。
什么是阻塞和非阻塞?
A調用B,我們針對得是調用方A
如果是阻塞的話,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

針對Sender而言,請求發送出去以后,一直等到Receiver有結果了才返回,這是同步。在Sender獲取結果的期間一直被blocked住了,也就是在此期間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期間一直是可以處理其它事情的,這是非阻塞。
應用說明
(1) Redis速度快的原因之一就是因為是異步非阻塞的。
(2) R2dbc和MyBatis/JPA一樣都是訪問數據庫的技術,不同的是 R2DBC是異步非阻塞的MyBatis/JPA是同步阻塞。
希望本文章對您有幫助,您的轉發、點贊是我的創作動力,十分感謝。
掃描下方二維碼關注微信公眾號,您會收到更多優質文章推送。


浙公網安備 33010602011771號