網上流傳著乙個小故事來介紹同步/非同步,阻塞/非阻塞的概念
相信不少同學都看過,(普通水壺,簡稱水壺;會響的水壺,簡稱響水壺)。具體如下:
同步阻塞:小明把水壺放到火上,然後在那傻等水開
同步非阻塞:小明把水壺放到火上,然後去客廳看電視,時不時的去廚房看看水開沒有
非同步阻塞:小明把響水壺放到火上,然後在那傻等水開
非同步非阻塞:小明把響水水壺放到火上,去客廳看電視,水壺響之前不再去看它了,響了再去處理
剛看到這個例子的時候,我也覺得講的很生動,一看就明白,但是過一段時間之後,發現自己還是會混淆上面的幾個概念(冥冥之中覺得有bug)。反覆查閱網上資料之後,發現網上基本都是這個例子。最後查閱書籍,終於明白了上述概念的真正含義。
上面的例子讓人有以下感覺:
一、如果是同步,那一定就是阻塞的啊,因為呼叫者需要拿到結果才能執行後面的任務
二、如果是非同步,那一定是非阻塞的啊,呼叫者可以繼續往後執行
現在是我給大家解惑的時候了,直接給出概念
同步/非同步:形容一次方法的呼叫,在單執行緒中。描述的是執行者是否具備主動通知功能
同步,呼叫者會等到方法呼叫返回後才能繼續後面的行為
非同步,呼叫者不需要等到方法返回,方法執行完畢後會主動通知呼叫者
阻塞/非阻塞:呼叫者是否可以執行多個任務,在多個執行緒中。描述的是呼叫者的多個執行緒是否可以同時執行
阻塞,執行緒1和執行緒2不能同時進行
非阻塞,執行緒1和執行緒2可以同時進行
總結:
看明白了嗎?網上小明燒水的這個例子完全沒有提及多執行緒(被隱藏起來,需要我們自己去發現和理解),但是同步和阻塞完全是在單執行緒和多執行緒這兩個維度上的概念。簡單的說,如果是單執行緒,不管是同步還是非同步,肯定是阻塞的。阻塞和非阻塞只有在多執行緒中才有意義。並且小明燒水的時候去看電視,隱含了這裡就是另外新開了乙個執行緒去看電視,而不是在燒水的這個執行緒中去執行看電視,否則毫無意義。以上,歡迎指正!
同步 非同步,阻塞 非阻塞理解
由於同步非同步,阻塞非阻塞都學習了有一段時間了。慢慢了快忘了,所以乾脆趁著寒假把知識點都撿起來,寫出來。同步和非同步是一組概念,阻塞和非阻塞是一組概念。大家不要搞混了,不要把同步和阻塞等價,也不要把非同步和非阻塞等價 戲說不是胡說,改編不是亂編 滑稽 在剛開始理解的時候很容易搞混,我們這樣想,同步和...
同步 非同步 阻塞 非阻塞的理解
同步與非同步是針對應用程式與核心的互動而言的。同步過程中程序觸發io操作並等待或者輪詢的去檢視io操作是否完成。非同步過程中程序觸發io操作以後,直接返回,做自己的事情,io交給核心來處理,完成後核心通知程序io完成。應用程序請求i o操作時,如果資料未準備好,如果請求立即返回就是非阻塞,不立即返回...
同步 非同步 阻塞 非阻塞的理解
同步關注的是訊息通訊機制 訊息回來是我處理就是同步,否則就是非同步 阻塞關注的是等待訊息時的狀態 一直等著是阻塞,該幹嘛幹嘛是非阻塞 燒水同步阻塞 點火 發訊息 傻等 阻塞 開了之後處理 同步非阻塞 發訊息 去看電視 非阻塞 一會看下水是否開了,開水之後做處理 非同步阻塞 發訊息 傻等水壺響 同步 ...