天天看點

區分阻塞與非阻塞&&同步與異步引例總結

這兩對概念非常相似,但略有不同(阻塞與同步,非阻塞與異步易混淆)

引例

先來看幾個例子。

天下文章一大抄,殊途同歸嘛。從幾篇比較好的文章上看到了例子,有助于了解。随後通過例子再自己總結一下。

例1

你打電話問書店老闆有沒有《分布式系統》這本書,如果是同步通信機制,書店老闆會說,你稍等,”我查一下",然後開始查啊查,等查好了(可能是5秒,也可能是一天)告訴你結果(傳回結果)。

而異步通信機制,書店老闆直接告訴你我查一下啊,查好了打電話給你,然後直接挂電話了(不傳回結果)。然後查好了,他會主動打電話給你。在這裡老闆通過“回電”這種方式來回調。

作者:嚴肅 連結:https://www.zhihu.com/question/19732473/answer/20851256 來源:知乎

著作權歸作者所有。商業轉載請聯系作者獲得授權,非商業轉載請注明出處。

例2

故事:老王燒開水。

出場人物:老張,水壺兩把(普通水壺,簡稱水壺;會響的水壺,簡稱響水壺)。

老王想了想,有好幾種等待方式

1.老王用水壺煮水,并且站在那裡,不管水開沒開,每隔一定時間看看水開了沒。-同步阻塞

老王想了想,這種方法不夠聰明。

2.老王還是用水壺煮水,不再傻傻的站在那裡看水開,跑去寝室上網,但是還是會每隔一段時間過來看看水開了沒有,水沒有開就走人。-同步非阻塞

老王想了想,現在的方法聰明了些,但是還是不夠好。

3.老王這次使用高大上的響水壺來煮水,站在那裡,但是不會再每隔一段時間去看水開,而是等水開了,水壺會自動的通知他。-異步阻塞

老王想了想,不會呀,既然水壺可以通知我,那我為什麼還要傻傻的站在那裡等呢,嗯,得換個方法。

4.老王還是使用響水壺煮水,跑到客廳上網去,等着響水壺自己把水煮熟了以後通知他。-異步非阻塞

老王豁然,這下感覺輕松了很多。

https://www.cnblogs.com/zihe/p/8323585.html

例3

  • 同步:今天你去超市買東西,你打電話問女友今天吃什麼,然後女友說:"讓我想一想,想一想~"這一想可能很長時間,你在旁邊等着直到她說我想吃: “紅燒肉”(結果傳回)然後你就去買食材。
  • 異步: 你打電話問老媽紅燒肉怎麼做,她說:“有點麻煩,一時半會兒說不全(程式複雜,費時),等我理好思路之後給你發微信吧”(通過狀态,通知或者回調函數通知調用者)。這時候你不用等待,去買其他東西了。(立即處理執行後面的程式)
  • 阻塞:你在超市食材區排隊買肉,這時候貨架上肉賣完了,需要等待售貨員詢問是否還有肉,這時候你就一直在等(線程被挂起),直到新的肉到來或者庫存已空(結果傳回)。
  • 非阻塞:你在超市除了想買食材還想買水果,買日用品等,這時候你不打電話了,發微信給女友說:“你想吃什麼,想好告訴我,我正在超市買東西”。這時候你不用等她立即回複,你去買水果,日用品等,但主要目的買菜還沒得到回複,是以你時不時的去看一下微信(輪詢檢視是否傳回結果)
https://segmentfault.com/a/1190000016827291

總結

看了三個例子,感覺好像明白了,但又覺得和自己之前了解的沒差多少,還又覺得同步異步和阻塞非阻塞不就是一回事麼?是以,這四個東西到底是啥

  • 同步:請求方調用之後主動等待傳回值
  • 異步:請求方調用之後去執行别的操作,被調用者執行完成後會通知請求方
  • 阻塞:請求方調用之後,線程會被挂起,直到拿到傳回值為止
  • 非阻塞:請求方調用之後去執行别的操作,過程中請求方還需要時不時檢視輪詢被調用者是否執行完成

同步和阻塞都是在等待傳回值的時候不能處理其他事情;異步和非阻塞差別在于對象不同,前者是被調用者通知請求方,後者是請求方要自己主動檢視