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


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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM