細說同步異步、阻塞非阻塞

同步、異步

同步、異步分別指的是一種通訊方式,當 cpu 不需要執行線程上下文切換就能完成任務,此時便認為這種通訊方式是同步的,相對的如果存在cpu 上下文切換,這種方式便是異步。

細說同步異步、阻塞非阻塞

這裡通過一個去食堂打飯的示例來理解什麼是同步、異步

同步

假設現是上午最後一節課,由於小李上課的教室離食堂比較遠,當下課之後,如果小李跑得不夠快,那麼到食堂之後會發現別人已經早你一步到達了,而小李又是個三好學生,又不能插隊,此時小李只能悲痛欲絕的排在打飯窗口A的隊伍最後一個人後面,依次等待輪到小李填寫菜單然後取飯

異步

同樣的場景,當小李跑到食堂之後,由於身體不好,已經氣喘吁吁,此時又想找個位置休息下,又太餓,想去排隊打飯。還好,窗口B 提供了這個功能,打飯的人先去取號並填寫菜單,然後就可以去做其他事情,等到排的號到小李了之後,食堂阿姨會通過這個號碼來呼叫你來取已經做好的飯,這時你心中一喜,這不就是我現在需要的麼,於是你拿了號及填寫菜單之後,便去找個位置佔著,一邊等待食堂阿姨叫你來取飯,同時還可以與朋友聊聊人生

總結 可以看出,同步的方式的耗時包含了:1.排隊等待 2.填寫菜單 3.等待廚師做好 而異步的方式則可以直接填寫好菜單、取個號然後交給食堂阿姨之後,便可以去做其他的事情,完全沒有等待的耗時,只需要在食堂阿姨呼喚你的時候,來取飯即可。

異步通常能提高系統的吞吐量,從 Servlet 3.0 便支持通過異步的方式來處理請求,當然這並不代表它什麼都好,缺點是會降低系統的一部分響應時間,而且增加了系統的複雜度,使調試困難 同步相對的便是,編程簡單,響應速度快,不需要對線程上下文進行切換

阻塞、非阻塞

阻塞、非阻塞指的是在同步模式下,如果當前線程一直在等待響應數據並且不能做其他事情那麼認為是阻塞的,如果當前線程在等待響應數據返回的同時,又可以幹其他的時,那麼則是非阻塞的

細說同步異步、阻塞非阻塞

同樣的,這裡再次使用食堂打飯的場景

阻塞

當小徐到食堂時,已經有許多人在排隊打飯了,這時小徐無奈之下,選擇了離她最近的窗口A排隊打飯,然後等待的時間總是漫長的,這時她百般無聊下,想拿出她的手機準備消磨下時間,結果她突然想起手機還在教室!雖然站在這裡排隊打飯沒有手機玩,但也是不幸中的萬幸了,總算手機沒丟

非阻塞 第二次,小徐再次來到食堂,發現食堂新增了取號的功能,但是隻能取號,不能填寫菜單,最終還是選擇了這家取號的窗口B,等著叫號然後寫菜單就可以了,小徐興高采烈的玩起了手機,刷起了簡書

總結

當你排隊在窗口A的時候,此時不能做其他任何事情,只能等著隊伍到自己這,然後填寫菜單,最後等待取飯,此時在整個排隊的週期內都不能幹其他事情 而在窗口B則可以通過取號的方式,讓你不需要時刻的去站著排隊,而是可以去刷刷簡書、打打遊戲

JDK中的BIO 對應的就是阻塞IO,NIO 對應的是非阻塞IO,通過非阻塞IO,可以讓一個線程處理成千上萬的併發請求


作者:coding400
鏈接:https://www.jianshu.com/p/69e90f9bbd7c
來源:簡書
著作權歸作者所有。商業轉載請聯繫作者獲得授權,非商業轉載請註明出處。


分享到:


相關文章: