那些年搞不懂的多執行緒、同步非同步及阻塞和非阻塞(二)---概念區分

木叔發表於2017-08-08
概念解釋:
 
同步/非同步, 它們是訊息的通知機制
 
同步:
所謂同步,就是在發出一個功能呼叫時,在沒有得到結果之前,該呼叫就不返回。
簡單來說就是當前程式執行完才能執行後面的程式,程式執行時按照順序執行,平時寫的程式碼基本都是同步的;
 
非同步:
非同步的概念和同步相對。
當一個非同步過程呼叫發出後,呼叫者不會立刻得到結果。實際處理這個呼叫的部件是在呼叫發出後,通過狀態、通知來通知呼叫者,或通過回撥函式處理這個呼叫。
簡單來說就是程式沒有等到上一步程式執行完才執行下一步,而是直接往下執行,前提是下面的程式沒有用到非同步操作的值,非同步的實現方式基本上都是多執行緒(定時任務也可實現,但是情況少)。
 
阻塞/非阻塞, 它們是程式在等待訊息(無所謂同步或者非同步)時的狀態.
 
阻塞:
阻塞呼叫是指呼叫結果返回之前,當前執行緒會被掛起。函式只有在得到結果之後才會返回。
有人也許會把阻塞呼叫和同步呼叫等同起來,實際上他是不同的。
對於同步呼叫來說,很多時候當前執行緒還是啟用的,只是從邏輯上當前函式沒有返回而已。
 
非阻塞:
非阻塞和阻塞的概念相對應,指在不能立刻得到結果之前,該函式不會阻塞當前執行緒,而會立刻返回。
 
簡單示例:老張燒水
老張愛喝茶,廢話不說,煮開水。
出場人物:老張,水壺兩把(普通水壺,簡稱水壺;會響的水壺,簡稱響水壺)。
1 老張把水壺放到火上,立等水開。(同步阻塞)
 
老張覺得自己有點傻
2 老張把水壺放到火上,去客廳看電視,時不時去廚房看看水開沒有。(同步非阻塞)
 
老張還是覺得自己有點傻,於是變高階了,買了把會響笛的那種水壺。水開之後,能大聲發出嘀~~~~的噪音。
3 老張把響水壺放到火上,立等水開。(非同步阻塞)(本可以坐著等通知的卻非要立即等著,實際不大會出現這種情況,非同步非同步阻塞沒有實際意義)
 
老張覺得這樣傻等意義不大
4 老張把響水壺放到火上,去客廳看電視,水壺響之前不再去看它了,響了再去拿壺。(非同步非阻塞)
 
所謂同步非同步,只是對於水壺而言。
普通水壺,同步;響水壺,非同步。
雖然都能幹活,但響水壺可以在自己完工之後,提示老張水開了。這是普通水壺所不能及的。
同步只能讓呼叫者去輪詢自己(情況2中),造成老張效率的低下。
所謂阻塞非阻塞,僅僅對於老張而言。
立等的老張,阻塞;看電視的老張,非阻塞。
情況1和情況3中老張就是阻塞的,媳婦喊他都不知道。雖然3中響水壺是非同步的,可對於立等的老張沒有太大的意義。所以一般非同步是配合非阻塞使用的,這樣才能發揮非同步的效用。
 
同步阻塞關係:
執行緒阻塞(祥見多執行緒介紹)除了程式主動呼叫休眠外常見的就是程式遇到同步程式碼塊,同一時間不能並行執行,當有多個請求了出現執行緒等待的情況即為阻塞。
 
同步原因:
阻塞源於同步程式碼塊,首先需要弄清楚何時需要同步,需要同步的地方是因為多個執行緒操作了同一個變數,導致在並行執行時變數值的混亂,故需要加同步鎖來實現同一時間只能有同一個執行緒執行同步程式碼塊中的程式,如果不涉及多執行緒操作同一個變數的情況是不需要使用同步的,在多執行緒程式設計時儘量避免操作公共變數來避免阻塞。
 

相關文章