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