同步、异步、阻塞、非阻塞
一個小故事
故事:小A燒開水。
出場人物:小A出場道具:普通水壺(放在煤氣灶上的那種,為了方便簡稱:水壺);會響的水壺(水燒開了會響的那種,簡稱:響壺)。故事目的:小A要拿開水泡咖啡
小A為了實現目的,指定了4個計劃:
1、用水壺燒水,并且站在煤氣灶旁邊,啥事不干,兩眼直勾勾的盯著水壺,等水燒開。燒開后就去泡咖啡。同步阻塞
假設燒水和泡咖啡是在同一個線程中執行。
2、仍然用水壺煮水,不過此時不再傻傻得站在那里看水開沒開,而是去玩局LOL,每當自己死了,就過來看看水開了沒有。如果水開了就去泡咖啡。同步非阻塞
假設這里玩LOL,是另一個線程運行的。
3、動用響壺燒水,仍然站在煤氣灶旁邊,不過此時不兩眼直勾勾的盯著壺了,而是聽響,因為響壺水開時會用響聲通知小A。異步阻塞
4、在計劃3的基礎上,小A不站在煤氣灶旁邊了,而是去玩局LOL,等聽到響壺的聲音提醒后,再去跑咖啡。異步非阻塞
有了上邊的故事鋪墊,我們再來看一看概念
同步:
同步這個詞在很多場合下都會被使用,如果單從字面意思來看:相同的步驟。但是在編程的領域里講,字面意思就不那么準確了。
對于編程領域來說,同步就是發起一個請求,直到請求返回結果之后,才進行下一步操作。簡單來說,同步就是必須一件事一件事的做,等前一件做完了,才能做下一件事。
例子:此種模式很常見,比如我發起一個網絡請求查詢一個人的身份證,然后根據身份證查看這個人的詳細信息。那么我查詢詳細信息的操作需要等待查詢身份證的操作,那么此時查詢身份證的操作就是一個同步操作。
異步:
異步很明顯是與同步相對,二者的區別在于是否需要等待某操作的返回結果。簡單來說,我們還是一個網絡請求,如果我們此時不需要依賴這個請求的結果就能進行后續操作,那么此時這個網絡請求就是一個異步操作。
當一個異步操作發出后,調用者在沒有得到結果之前,可以繼續執行后續操作。這就是異步。
同步和異步的區別:
二者的區別還是很明顯的:請求發出后,是否需要等待請求結果,才能繼續執行其他操作。
阻塞
阻塞的概念往往伴隨著線程。阻塞一般是指:在調用結果返回之前,當前線程會被掛起。調用線程只有在得到結果之后才會被喚醒執行后續的操作。
非阻塞
那么非阻塞,毫無疑問是阻塞的反向操作。非阻塞式的調用指:在結果沒有返回之前,該調用不會阻塞住當前線程。
是不是感覺阻塞/非阻塞和同步/異步有異曲同工的地方?
其實,這兩者存在本質的區別,面向的對象是不同的。
阻塞/非阻塞:進程/線程需要操作的數據如果尚未就緒,是否妨礙了當前進程/線程的后續操作。同步/異步:數據如果尚未就緒,是否需要等待數據結果。
并發和并行
二者的區分度非常的高,就在于四個字:是否同時。
并發:當有多個線程在操作時,如果系統只有一個CPU,操作系統只能把CPU運行時間劃分成若干個時間段,再將時間段分配給各個線程執行,在一個時間段的快速的切換不同的線程代碼運行。
并行:當系統有多個CPU時,可以存在當一個CPU執行一個線程時,另一個CPU可以執行另一個線程,兩個線程互不搶占CPU資源,可以同時進行。
舉個小例子
小A吃飯吃到一半,電話來了,小A一直到吃完了以后才去接。既不支持并發也不支持并行
小A吃飯吃到一半,電話來了,小A停了下來接了電話,接完后繼續吃飯。支持并發
小A吃飯吃到一半,電話來了,小A一邊打電話一邊吃飯。支持并行
轉載于:https://www.cnblogs.com/yanghj0205/p/11001792.html
總結
以上是生活随笔為你收集整理的同步、异步、阻塞、非阻塞的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 5天玩转C#并行和多线程编程 —— 第五
- 下一篇: 微信小程序打开PDF