老張愛喝茶,廢話不說,煮開水。
出場人物:老張,水壺兩把(普通水壺,簡稱水壺;會響的水壺,簡稱響水壺)。
1 老張把水壺放到火上,立等水開。(同步阻塞)
老張以爲本身有點傻
2 老張把水壺放到火上,去客廳看電視,時不時去廚房看看水開沒有。(同步非阻塞)
老張仍是以爲本身有點傻,因而變高端了,買了把會響笛的那種水壺。水開以後,能大聲發出嘀~~~~的噪音。
3 老張把響水壺放到火上,立等水開。(異步阻塞)
老張以爲這樣傻等意義不大
4 老張把響水壺放到火上,去客廳看電視,水壺響以前再也不去看它了,響了再去拿壺。(異步非阻塞)
老張以爲本身聰明瞭。
所謂同步異步,只是對於水壺而言。
普通水壺,同步;響水壺,異步。
雖然都能幹活,但響水壺能夠在本身完工以後,提示老張水開了。這是普通水壺所不能及的。
同步只能讓調用者去輪詢本身(狀況2中),形成老張效率的低下。
所謂阻塞非阻塞,僅僅對於老張而言。
立等的老張,阻塞;看電視的老張,非阻塞。
狀況1和狀況3中老張就是阻塞的,媳婦喊他都不知道。雖然3中響水壺是異步的,可對於立等的老張沒有太大的意義。因此通常異步是配合非阻塞使用的,這樣才能發揮異步的效用。
程序員寫程序,不少狀況下,老張和水壺都要涉及,即調用者與被調用者。四種組合模式各有所長。
這個例子和銀行排隊有殊途同歸之妙,但是我以爲這個會比較容易理解一些。
老張一次比一次聰明,我認可跟老張很像。剛開始的狀況邏輯比較簡單,但效率低下。隨着慢慢的提升,效率也提升了。因此我的認爲,程序的效率和簡單程度是成反比的。
但不是說異步非阻塞就必定是最好的,有的狀況下更適合使用同步或者阻塞。程序員
併發(concurrency)和並行(parallellism)是:多線程
你吃飯吃到一半,電話來了,你一直到吃完了之後纔去接,這就說明你不支持併發也不支持並行。
你吃飯吃到一半,電話來了,你停了下來接了電話,接完後繼續吃飯,這說明你支持併發。
你吃飯吃到一半,電話來了,你一邊打電話一邊吃飯,這說明你支持並行。併發
併發是兩個隊列交替使用一臺咖啡機,並行是兩個隊列同時使用兩臺咖啡機異步
併發的關鍵是你有處理多個任務的能力,不必定要同時。
並行的關鍵是你有同時處理多個任務的能力。分佈式
併發(Concurrency)是說進程B的開始時間是在進程A的開始時間與結束時間之間,咱們就說A和B是併發的。
並行(Parallel Execution)是併發的真子集,指同一時間兩個進程運行在不一樣的機器上或者同一個機器不一樣的核心上。oop