大白話搞懂什麼是同步/異步/阻塞/非阻塞

前言

在最近的一些面試中,跟應聘者聊了比較多關於「同步/異步,阻塞/非阻塞」相關的話題,發現你們對於這些概念的理解都比較模糊,甚至有的同窗會反問「他們不就是同一個東西嗎?」。因此藉着這麼一個機會,我想用一些儘可能簡單的例子,儘可能簡潔的語言來聊聊本身對於這些概念的見解。程序員

正文

這篇文章想經過一個老王「候車」的案例來解釋這些概念。面試

同步阻塞

放假了,老王回到了鄉下,因爲鄉下的基礎設施比較差,當他在車站候車的時候,只能一直在乾等着,直到公交車的到站。異步

這時候對於公交車(被調用着者)來講,它是「同步「的。老王(調用者)被公交車(被調用者)「阻塞」在站臺上。分佈式

異步阻塞

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

那麼這時候對於公交車(被調用着者)來講,它是「異步「的,到站後會通知調用者。可是此時老王(調用者)仍是被公交車(被調用者)「阻塞」在站臺上。post

同步非阻塞

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

那麼這時候對於公交車(被調用着者)來講,它是「同步「的。可是此時老王(調用者)能夠在候車的時候去幹其餘的的事情,因此他是「非阻塞」的。cdn

異步非阻塞

改革春風吹滿地,新農村建設正在火熱進行中,此時的鄉下,公交車裏面也安裝了車輛到站的提醒廣播。如今老王在候車的時候,能夠安心的跟小花敘舊了,當聽到本身須要乘坐的車輛到站廣播時,纔過去車站上車。對象

這時候對於公交車(被調用着者)來講,它是「異步「的,到站後會廣播提醒,此時老王(調用者)能夠在候車的時候去幹其餘的的事情,因此他是「非阻塞」的get

概念總結

從上面的示例中,咱們能夠明白一件事情,同步異步,阻塞非阻塞他們針對的對象是不同的。對於調用者來講是阻塞跟非阻塞,被調用者是同步跟異步。

同步: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,不只加大了編碼的難度也提升的出錯的機率,技術的出現是爲了更好的解決問題。

結語

這篇文章主要是想經過你們熟悉的場景來描述這些概念的含義以及區別,若是想更深刻的去鑽研的話,你們能夠去查閱Linux IO模型相關資料,Java的IO API也是基於這些基礎模型來封裝的。


推薦閱讀

Java異常處理最佳實踐及陷阱防範
論JVM爆炸的幾種姿式及自救方法
女友也能看懂的Zookeeper分佈式鎖原理
解放程序員雙手之Supervisor

有收穫的話,就點個贊吧

關注「深夜裏的程序猿」,分享最乾的乾貨

相關文章
相關標籤/搜索