1. 程式人生 > >看完就明白什麼是同步/非同步、阻塞/非阻塞

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

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

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

  在櫃檯前排隊一直等在那裡辦理業務(同步),在等到辦理業務前不做任何其他事情(阻塞);

  在櫃檯前排隊一直等在那裡辦理業務(同步),在等到辦理業務前做其他事情,比如玩手機,玩手機的時候需要不時地去看

是否已經排隊排到了(非阻塞);

  去取號機上拿個號,當輪到辦理業務的時候會叫號,不用一直等在那裡(非同步),在叫號辦理業務前不做任何其他事情(阻塞);

  去取號機上拿個號,當輪到辦理業務的時候會叫號,不用一直等在那裡(非同步),在叫號辦理業務前做其他事情,比如玩手機,玩手機的時候不用關心是否排隊排到了,因為會叫號通知我(非阻塞);  

  通過去銀行櫃檯辦理業務的場景我們可以發現同步/非同步、阻塞/非阻塞之間關注的點不一樣,同步/非同步關注的是訊息如何通知,在上面那個場景裡就是兩種不同的通知方式:同步通知方式是由排隊人一直等訊息,非同步通知方式是由叫號機發送訊息來通知,排隊人無需關注訊息,這是同步/非同步之間的主要區別。阻塞/非阻塞關注的是等待訊息通知時的狀態,阻

塞的時候排隊人的狀態不變一直等著,非阻塞的時候可以變成其他非等待狀態,如看手機,出去抽菸等。需要特別說明一下的是同步非阻塞這種狀態,可以發現在做其他事情的時候需要不停的檢查等待結果,所以這裡存在一個任務切換引起的資源消耗問題。

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

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

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

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

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

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

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

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