同步,異步;阻塞,非阻塞的區分

這篇文章想通過一個老王“候車”的案例來解釋這些概念。

同步阻塞

放假了,老王回到了鄉下,由於鄉下的基礎設施比較差,當他在車站候車的時候,只能一直在乾等着,直到公交車的到站。
這時候對於公交車(被調用着者)來說,它是“同步“的。老王(調用者)被公交車(被調用者)“阻塞”在站臺上。

異步阻塞

放完假了,老王回到了大城市開始上班,同樣在車站候車,一樣在車站乾等着,但是大城市的基礎設施建設得比較好,當公交車到站的時候,會有廣播提示提醒乘客。

那麼這時候對於公交車(被調用着者)來說,它是“異步“的,到站後會通知調用者。但是此時老王(調用者)還是被公交車(被調用者)“阻塞”在站臺上。

同步非阻塞

過年了,老王放假回來了鄉下,又要開始候車了,這時候他變聰明瞭,沒有一直在車站上乾等着,而是去找隔壁的小花敘敘舊。但是又害怕車到站了自己會錯過,就只能隔一段時間過來看看車到了沒。

那麼這時候對於公交車(被調用着者)來說,它是“同步“的。但是此時老王(調用者)可以在候車的時候去幹其他的的事情,所以他是“非阻塞”的。

異步非阻塞

春風吹滿地,新農村建設正在火熱進行中,此時的鄉下,公交車裏面也安裝了車輛到站的提醒廣播。現在老王在候車的時候,可以安心的跟小花敘舊了,當聽到自己需要乘坐的車輛到站廣播時,纔過去車站上車。

這時候對於公交車(被調用着者)來說,它是“異步“的,到站後會廣播提醒,此時老王(調用者)可以在候車的時候去幹其他的的事情,所以他是“非阻塞”的

概念總結

從上面的示例中,我們可以明白一件事情,同步異步,阻塞非阻塞他們針對的對象是不一樣的。對於調用者來說是阻塞跟非阻塞,被調用者是同步跟異步。

同步:A調用B,此時只有等B有結果了才返回。
異步: A調用B,B立即返回,無須等待。當B處理完之後會通過通知或者回調函數的方式來告訴A結果。
阻塞:A調用B,A會被被掛起,一直在等待B的結果,什麼事都不能幹。
非阻塞:A調用B,自己用被掛起等待B的結果,可以去幹其他的事情。

Java中相關概念

在Java中的IO模型有三種,分別是BIO(同步阻塞IO),NIO(同步非阻塞IO),AIO(異步非阻塞IO)。這時候我們會發現,異步阻塞的模型是不存在的。

NIO跟AIO的出現解決了很多在BIO使用過程遇到的難題,所以我們在選擇使用何種IO的時候需要根據業務場景來做決定,沒必要一味追求NIO跟AIO,不僅加大了編碼的難度也提高的出錯的概率,技術的出現是爲了更好的解決問題。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章