看完就明白什麼是同

看完就明白什麼是同/異步、阻塞/非阻塞

Java

相信做開發的或多或少都聽說過同步、異步、阻塞、非阻塞這四個詞,它們也可以分成兩對,也就是同步、異步一對,阻塞、非阻塞一對,這個看詞義就很好理解。關鍵問題在於同步和阻塞、異步和非阻塞之間的區別,很多人對這兩組概念有點分不清,感覺意思差不多,其實它們描述的是兩個不同的問題,我們用一個具體的場景來描述一下這四個詞,用真實的生活場景感受一下它們的不同。

我們應該都有過去銀行櫃檯辦理業務的經歷,當人很多的時候往往要排隊等待,那麼這時候就可能出現這四種情況:

在櫃檯前排隊(同步),在排隊過程中不做任何其他事情(阻塞);

在櫃檯前排隊(同步),在排隊過程中做其他事情,比如玩手機,注意,玩手機的時候需要不時地去看是否已經排隊排到了(非阻塞);

叫號排隊,不用一直等在櫃檯前(異步),在排到前不做任何其他事情(阻塞);

叫號排隊,不用一直等在櫃檯前(異步),在排到前做其他事情,比如玩手機,玩手機的時候不用關心是否排隊排到了,因為會叫號通知(非阻塞);

通過去銀行櫃檯辦理業務的場景我們可以發現同步/異步、阻塞/非阻塞之間關注的點不一樣,同步/異步關注的是消息如何通知,在上面那個場景裡就是兩種不同的通知方式:同步通知方式是由排隊人一直等消息,異步通知方式是由叫號機發送消息來通知,排隊人無需關注消息,這是同步/異步之間的主要區別。阻塞/非阻塞關注的是等待消息通知時的狀態,阻塞的時候排隊人的狀態不變一直等著,非阻塞的時候可以變成其他非等待狀態,如看手機,出去抽菸等。需要特別說明一下的是同步非阻塞這種狀態,可以發現在做其他事情的時候需要不停的檢查等待結果,所以這裡存在一個任務切換引起的資源消耗問題。

現在我們來總結一下同步/異步、阻塞/非阻塞之間的區別:同步和異步僅僅是關注的消息如何通知的機制,而阻塞與非阻塞關注的是等待消息通知時的狀態。也就是說,同步的情況下,是由處理消息者自己去等待消息是否被觸發,而異步的情況下是由觸發機制來通知處理消息者。

相信看完上文你已經基本搞清楚同步/異步、阻塞/非阻塞的概念了,接下來我們通過一個生活實例來鞏固複習一下,看看自己是否真的已經掌握。

平時大家都會上網下載一些東西,這裡就假設我要下載一個視頻,我們用這個場景再來複習一下同步/異步、阻塞/非阻塞的概念:

我通過看下載精度條等待下載完成的結果(同步),期間不做其他事情(阻塞)

我通過看下載精度條等待下載完成的結果(同步),期間去聊QQ,在聊QQ的時候不停地去看下載是否完成(非阻塞)

通過下載完成的提示音通知得到下載完成的結果(異步),期間不做其他事情(阻塞)

通過下載完成的提示音通知得到下載完成的結果(異步),期間去聊QQ,在聊QQ的時候不需要去看下載是否完成,因為下載完了提示音會通知我(非阻塞)

最後,需要注意理解的是“消息通知機制”和“等待消息通知時的狀態”這兩個概念,這是理解同步/異步、阻塞/非阻塞四個概念的關鍵所在。還有我們在討論這四個概念的時候一定要放在同一個層級,比如操作系統級別,框架級別,業務代碼級別等,因為一個事件在不同層級所屬的性質不一定一樣,只有在同一個層級,才能去討論它的性質是同步/異步還是阻塞/非阻塞。

加Java架構師進階交流群獲取Java工程化、高性能及分佈式、高性能、深入淺出。高架構。性能調優、Spring,MyBatis,Netty源碼分析和大數據等多個知識點高級進階乾貨的直播免費學習權限 都是大牛帶飛 讓你少走很多的彎路的 群號是:338549832 對了 小白勿進 最好是有開發經驗

注:加群要求

1、具有工作經驗的,面對目前流行的技術不知從何下手,需要突破技術瓶頸的可以加。

2、在公司待久了,過得很安逸,但跳槽時面試碰壁。需要在短時間內進修、跳槽拿高薪的可以加。

3、如果沒有工作經驗,但基礎非常紮實,對java工作機制,常用設計思想,常用java開發框架掌握熟練的,可以加。

4、覺得自己很牛B,一般需求都能搞定。但是所學的知識點沒有系統化,很難在技術領域繼續突破的可以加。

5.阿里Java高級大牛直播講解知識點,分享知識,多年工作經驗的梳理和總結,帶著大家全面、科學地建立自己的技術體系和技術認知!


分享到:


相關文章: