看完就明白什麼是同步/非同步、阻塞/非阻塞
相信幹IT的或多或少都聽說過同步、非同步、阻塞、非阻塞這四個詞,它們也可以分成兩對,也就是同步、非同步一對,阻塞、非阻塞一對,這個看詞義就很好理解。關鍵問題在於同步和阻塞、非同步和非阻塞之間的區別,很多人對這兩組概念有點分不清,感覺意思差不多,其實它們描述的是兩個不同的問題,我們用一個具體的場景來描述一下這四個詞,用真實的生活場景感受一下它們的不同。
我們應該都有過去銀行櫃檯辦理業務的經歷,當人很多的時候往往要排隊等待,那麼這時候就可能出現這四種情況:
在櫃檯前排隊一直等在那裡辦理業務(同步),在等到辦理業務前不做任何其他事情(阻塞);
在櫃檯前排隊一直等在那裡辦理業務(同步),在等到辦理業務前做其他事情,比如玩手機,玩手機的時候需要不時地去看
去取號機上拿個號,當輪到辦理業務的時候會叫號,不用一直等在那裡(非同步),在叫號辦理業務前不做任何其他事情(阻塞);
去取號機上拿個號,當輪到辦理業務的時候會叫號,不用一直等在那裡(非同步),在叫號辦理業務前做其他事情,比如玩手機,玩手機的時候不用關心是否排隊排到了,因為會叫號通知我(非阻塞);
通過去銀行櫃檯辦理業務的場景我們可以發現同步/非同步、阻塞/非阻塞之間關注的點不一樣,同步/非同步關注的是訊息如何通知,在上面那個場景裡就是兩種不同的通知方式:同步通知方式是由排隊人一直等訊息,非同步通知方式是由叫號機發送訊息來通知,排隊人無需關注訊息,這是同步/非同步之間的主要區別。阻塞/非阻塞關注的是等待訊息通知時的狀態,阻
現在我們來總結一下同步/非同步、阻塞/非阻塞之間的區別:同步和非同步僅僅是關注的訊息如何通知的機制,而阻塞與非阻塞關注的是等待訊息通知時的狀態
。也就是說,同步的情況下,是由處理訊息者自己去等待訊息是否被觸發,而非同步的情況下是由觸發機制來通知處理訊息者。
相信看完上文你已經基本搞清楚同步/非同步、阻塞/非阻塞的概念了,接下來我們通過一個生活例項來鞏固複習一下,看看自己是否真的已經掌握。
平時大家都會上網下載一些東西,這裡就假設我要下載一個視訊,我們用這個場景再來複習一下同步/非同步、阻塞/非阻塞的概念:
我通過看下載精度條等待下載完成的結果(同步),期間不做其他事情(阻塞)
我通過看下載精度條等待下載完成的結果(同步),期間去聊QQ,在聊QQ的時候不停地去看下載是否完成(非阻塞)
通過下載完成的提示音通知得到下載完成的結果(非同步),期間不做其他事情(阻塞)
通過下載完成的提示音通知得到下載完成的結果(非同步),期間去聊QQ,在聊QQ的時候不需要去看下載是否完成,因為下載完了提示音會通知我(非阻塞)
最後,需要注意理解的是“訊息通知機制”和“等待訊息通知時的狀態”這兩個概念,這是理解同步/非同步、阻塞/非阻塞四個概念的關鍵所在。還有我們在討論這四個概念的時候一定要放在同一個層級,比如作業系統級別,框架級別,業務程式碼級別等,因為一個事件在不同層級所屬的性質不一定一樣,只有在同一個層級,才能去討論它的性質是同步/非同步還是阻塞/非阻塞。