其實,同步,異步的知識點,我是知道的,可是其中同步還分同步阻塞
,同步非阻塞
,異步阻塞
,異步非阻塞
這裏面我有些卻瞭解的卻不是很清楚,最近跟朋友討論這塊,才發現,盲點很多,藉此,想寫下這篇,記錄下學習跟理解的過程,所以,咱們須要先知道,什麼是 同步跟異步,什麼是 阻塞跟非阻塞異步
同步: 在發起一個調用的時候,沒有拿過結果以前,調用不會返回
異步: 在發起一個調用的時候,不須要等待拿到結果,調用直接返回,經過回調函數返回結果函數
從上面咱們大概能理解了什麼是同步跟異步了,可是解釋的不算接地氣,咱們打算舉個更接地氣的例子學習
咱們在食堂打飯,刷了飯卡後(發起一個調用),在沒等到食堂阿姨給咱們飯菜的時候,咱們是不能走的,由於咱們刷了飯卡,扣了錢了,須要給我飯菜,我才能走,因此,在食堂打飯這就是同步調用線程
咱們不在食堂吃飯,咱們在外面的飯店吃飯,在收銀員那點餐付款(發起一個調用)後,收銀員會給咱們一個牌子,咱們找個位置坐下來,後面會有服務員經過牌子找到咱們,把飯菜端上來給咱們(異步回調),由於咱們已經付款了,而且給了牌子,後面服務員能夠經過牌子找到咱們,我不須要一直在收銀員那等着告訴我結果,能夠直接找位置坐下來,因此在飯店吃飯是異步code
阻塞: 阻塞,是指調用結果返回以前,當前線程會被阻塞,調用結果返回後,當前線程纔會返回 非阻塞: 非阻塞,在不能立刻獲得調用結果以前,當前線程不會被阻塞回調函數
在上面,咱們大概能理解了,什麼是阻塞跟非阻塞,可是解釋的不算接地氣,咱們打算舉個更接地氣的例子同步
你打電話給小區內的一家飯店,想問問有沒有西紅柿雞蛋蓋飯,老闆告訴你,要去廚房看一下,有沒有西紅柿跟雞蛋了,若是你是阻塞調用,那麼你就要在電話旁邊一直等着,直到獲得是否有西紅柿雞蛋蓋飯這個結果,你一直等着結果,就是阻塞效率
仍是一樣的故事,你打電話給小區內飯店老闆,若是你是非阻塞調用,那麼你能夠把手機開擴音,放旁邊,能夠玩其餘的,偶爾你也要關注飯店老闆反饋給你的信息,看看有沒有西紅柿跟雞蛋,在等結果的同時,你還能玩其餘的,就是非阻塞總結
在上面,咱們介紹了關於 同步,異步,阻塞,非阻塞,同時咱們發現 同步跟阻塞,異步跟非阻塞的定義好像很像,可是實際上,他們不是一個東西,同步跟異步關注的是消息通訊
而阻塞跟非阻塞關注的是線程在等待調用結果時的狀態
,二者關注的點不同,所以,咱們不要混淆了概念通信
我總結一下,同步 阻塞 的差別跟關注點
同步: 調用方,主動等待結果的返回 阻塞: 線程,在結果沒有返回的時候,會被阻塞,只要有等結果返回以後才運行,換言之,就是線程處於阻塞
狀態
我總結一下 異步 非阻塞 的差別跟關注點
異步: 調用方,不須要等待調用結果的返回,在調用發出後,就返回了,沒有結果,須要經過回調函數來返回結果 非阻塞: 線程,在結果沒有返回的時候,處於運行
狀態,線程能夠去作其餘的
舉個例子,來描述下上述總結的內容
出場人物:老張,水壺兩把(普通水壺,簡稱水壺;會響的水壺,簡稱響水壺)
老張以爲本身聰明瞭。"所謂同步異步,只是對於水壺而言"。
雖然都能幹活,但響水壺能夠在本身完工以後,提示老張水開了。這是普通水壺所不能及的。同步只能讓調用者去輪詢本身(狀況2中),形成老張效率的低下.
所謂阻塞非阻塞,"僅僅對於老張而言"。
狀況1和狀況3中老張就是阻塞的,由於在等待水開的過程當中,他不能作其餘的。雖然3中響水壺是異步的,可對於等待水開的老張沒有太大的意義。因此通常異步是配合非阻塞使用的,這樣才能發揮異步的效用
從上面的例子,咱們應該能理解了關於同步 異步 阻塞 非阻塞的概念了,同步/異步是對用獲取水開的方式不一樣,阻塞/非阻塞是對於等待水開的過程當中,可否去作其它事情,所以我總結了一下前言提到的 同步阻塞
,同步非阻塞
,異步阻塞
,異步非阻塞
運行
狀態,能夠去作其餘的