如何給女朋友解釋什麼是IO中的阻塞、非阻塞、同步、非同步?
漫小畫
擅長漫話
程小員
擅長程式設計
週末在家加班,正在瘋狂的擼程式碼,女朋友很開心的跑過來,手裡拿著他剛剛畫好的一副漫畫。
我剛剛畫了一個很好看的漫畫,能不能幫我做個網站把它上傳到網上啊?
做網站可難不倒我。漫畫上傳,你希望是同步的還是非同步的啊?
啥同步非同步的我不懂,同步吧。
哦,那是阻塞的還是非阻塞的呢?
額、阻塞吧。
恭喜你,選擇了一種最慢的方式。
什麼鬼嘛,你給我繞懵了,給我講講這都是啥意思。
同步、非同步、阻塞、非阻塞都是和IO(輸入輸出)有關的概念。最簡單的檔案讀取就是IO操作。而在檔案讀取這件事兒上,可以有多種方式。
又拽概念了,你先給我說說啥叫同步、啥叫非同步。
好吧,你去給我燒點水,泡杯咖啡我慢慢給你講。
什麼是同步和非同步
說到燒水,我們都是通過熱水壺來燒水的。在很久之前,科技還沒有這麼發達的時候,如果我們要燒水,需要把水壺放到火爐上,我們通過觀察水壺內的水的沸騰程度來判斷水有沒有燒開。
隨著科技的發展,現在市面上的水壺都有了提醒功能,當我們把水壺插電之後,水壺水燒開之後會通過聲音提醒我們水開了。
對於燒水這件事兒來說,傳統水壺的燒水就是同步的,高科技水壺的燒水就是非同步的。
同步請求,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模型。
額、剛剛好像明白了,現在又不懂了。
那我再拿燒水的例子給你解釋一遍。
BIO (Blocking I/O):有一排水壺在燒開水,BIO的工作模式就是,叫一個執行緒停留在一個水壺那,直到這個水壺燒開,才去處理下一個水壺。但是實際上執行緒在等待水壺燒開的時間段什麼都沒有做。
NIO (New I/O):NIO的做法是叫一個執行緒不斷的輪詢每個水壺的狀態,看看是否有水壺的狀態發生了改變,從而進行下一步的操作。
AIO ( Asynchronous I/O):為每個水壺上面裝了一個開關,水燒開之後,水壺會自動通知我水燒開了。
奧,你就說燒水我就明白了。
嗯,這就是Java中的三種IO模型。
Java好厲害啊,自己都能實現這些IO組合。
也不是啦,Java中的IO還是藉助作業系統的IO模型的,只不過是對作業系統IO模型的封裝而已啦。
那你再給我講講作業系統的IO模型吧。
滴滴滴滴,這時候水壺響了,打斷了女朋友的發問。女朋友去拿來燒好的熱水,給我泡了一杯咖啡。
諾,給你咖啡,我選好了,你就用AIO給我實現個漫畫上傳的網站吧。我晚上就要用。
額…
PS:如果覺得我的分享不錯,歡迎大家隨手點贊、轉發。
(完)
Java團長
專注於Java乾貨分享
掃描上方二維碼獲取更多Java乾貨
相關文章
- IO - 同步 非同步 阻塞 非阻塞的區別非同步
- 如何解讀 Java IO、NIO 中的同步阻塞與同步非阻塞?Java
- java同步非阻塞IOJava
- 大白話搞懂什麼是同步/非同步/阻塞/非阻塞非同步
- 同步非同步,阻塞非阻塞非同步
- 非同步、同步、阻塞、非阻塞非同步
- 同步、非同步,阻塞、非阻塞理解非同步
- 同步、非同步、阻塞與非阻塞非同步
- 同步非同步 與 阻塞非阻塞非同步
- 理解阻塞、非阻塞、同步、非同步非同步
- Java 非阻塞 IO 和非同步 IOJava非同步
- 同步、非同步、阻塞、非阻塞的區別非同步
- IO模式和IO多路複用(阻塞IO、非阻塞IO、同步IO、非同步IO等概念)模式非同步
- 談談對不同I/O模型的理解 (阻塞/非阻塞IO,同步/非同步IO)模型非同步
- 同步阻塞、同步非阻塞、多路複用的介紹
- 徹底搞懂同步非同步與阻塞非阻塞非同步
- 阻塞IO與非阻塞IO
- 怎樣理解阻塞非阻塞與同步非同步的區別?非同步
- socket阻塞與非阻塞,同步與非同步、I/O模型非同步模型
- python之IO併發-阻塞IO 非阻塞IO IO多路複用 非同步IO(協程)Python非同步
- IO通訊模型(二)同步非阻塞模式NIO(NonBlocking IO)模型模式BloC
- 對於同步、非同步、阻塞、非阻塞的幾點淺薄理解非同步
- 一篇文章讀懂阻塞,非阻塞,同步,非同步非同步
- ♻️同步和非同步;並行和併發;阻塞和非阻塞非同步並行
- [譯] 非同步程式設計:阻塞與非阻塞非同步程式設計
- 11、協程和io教程01 -- 併發 並行 同步 非同步 阻塞 非阻塞 以及 IO多路複用並行非同步
- 【OS】同步非同步/阻塞非阻塞、併發並行序列的區分非同步並行
- 對執行緒、協程和同步非同步、阻塞非阻塞的理解執行緒非同步
- python中非同步非阻塞如何實現Python非同步
- 併發-0-同步/非同步/阻塞/非阻塞/程式/執行緒非同步執行緒
- 聊聊執行緒與程式 & 阻塞與非阻塞 & 同步與非同步執行緒非同步
- 程式執行緒、同步非同步、阻塞非阻塞、併發並行執行緒非同步並行
- 【死磕NIO】— 阻塞、非阻塞、同步、非同步,傻傻分不清楚非同步
- [作業系統]阻塞io 非阻塞io Epoll作業系統
- FastAPI之阻塞式io和非阻塞式ioASTAPI
- 從同步原語看非阻塞同步以及Java中的應用Java
- 阻塞非阻塞和同步非同步的區分 參考一些書籍非同步
- 非同步/同步,阻塞/非阻塞,單執行緒/多執行緒概念梳理非同步執行緒