av一区二区在线观看_亚洲男人的天堂网站_日韩亚洲视频_在线成人免费_欧美日韩精品免费观看视频_久草视

您的位置:首頁技術文章
文章詳情頁

java - 同步/異步與阻塞/非阻塞之間的差異具體是什么?

瀏覽:127日期:2023-11-26 09:05:19

問題描述

就我的理解,同步/阻塞是同一概念,都是客戶端等待服務端的回執(zhí),服務端不返回回執(zhí),客戶端就不往下走;而異步/非阻塞則是客戶端不等待服務端的回執(zhí),直接往下走,等到服務端處理結束后,在調用異步回調函數(shù)通知客戶端。

但具體的,同步和阻塞,異步和非阻塞間的區(qū)別,分不清,有誰能解惑呢?

問題解答

回答1:

推薦一篇博文聊聊Linux 五種IO模型,寫的很不錯。簡要的跟你說下這幾個。首先,只有同步才有所謂的阻塞非阻塞,異步并沒有。常規(guī)的錯誤理解是,我們覺得異步就是非阻塞的,然而并不是這樣的。這里的同步和異步的區(qū)別就是,對于一個網(wǎng)絡IO或者磁盤IO的“整個過程”有沒有存在阻塞,是整個過程。以一次read的系統(tǒng)調用為例子,作為一個用戶線程,當你發(fā)起一次read的系統(tǒng)調用的時候,可以分為兩個操作,

一是數(shù)據(jù)讀取:把數(shù)據(jù)從磁盤讀到內核空間,我們都知道,read屬于系統(tǒng)調用,用戶級線程是無法操作的,只能交給內核線程去處理,而內核線程首先要找到數(shù)據(jù),并讀到內核空間中。

二是數(shù)據(jù)復制:把數(shù)據(jù)從內核空間讀取到用戶空間。然后用戶線程才可以使用這些數(shù)據(jù)。

所以簡單的說,

同步就是上述兩個過程都阻塞了,你用戶線程一直在等。

非阻塞就是上述第一個過程你沒有阻塞,但是用戶線程必須不斷的詢問os,數(shù)據(jù)是否從磁盤拷貝到內和空間了,如果拷貝好了,則在數(shù)據(jù)復制的過程阻塞。所以所有的同步過程,在第二階段都是阻塞的,盡管這是非阻塞的調用。

多路復用:和非阻塞一樣,在第二階段也是阻塞的,但是第一階段不再由自己去詢問操作系統(tǒng),而是統(tǒng)一交給一個內核線程去處理(linux上實現(xiàn)的有poll,以及改進版的epoll),當你的數(shù)據(jù)讀取完成,這個線程就發(fā)送一個信號給原先發(fā)起系統(tǒng)調用的用戶線程,然后用戶線程就進入阻塞,并開始數(shù)據(jù)拷貝了。

異步:上述兩個過程都是非阻塞的。

上述只是簡單描述,希望有幫助

回答2:

同步異步的概念主要是描述IO方面的。簡而言之同步和異步的主要區(qū)別是通知調用進程或線程的方式,立即返回通知即同步,通過注冊回調通知則是異步。阻塞和非阻塞主要描述函數(shù)的調用返回情況。函數(shù)立即返回即非阻塞,函數(shù)被掛起則阻塞。

舉個簡單類比場景,假如你去餐廳點餐。

同步阻塞

你跟訂餐員說要一份臺灣牛肉面,訂餐員聽見之后就去廚房,過了一會才拿出來給你。這段時間你就在前臺傻傻的等著,沒有任何回復,什么也不做(阻塞),你在下單之后沒有收到任何回復,一直等待的過程就是同步的通信。

同步非阻塞

你跟訂餐員說要一份蘭州牛肉面,訂餐員回復你說,估計要五分鐘。然后你想了一下,五分鐘可以刷一刷帖子,干點別的事情解悶。可是很快肚子餓,你每隔一分鐘就問一次好了沒,得到的回復就是還沒好,直到5分鐘后,才拿到面。等待的過程中你沒有閑著,可以干別的事情,這是非阻塞。由于你還是主動詢問結果并等待訂餐員的回復,所以這還是同步的。

異步阻塞與非阻塞

所謂異步,就是不需要你主動去詢問結果,而是注冊一個回調函數(shù)。即你點餐完畢之后,訂餐員給了你一個號。旁邊有一個機器,輪到你的時候,機器就會叫號。通知你的這個過程叫異步,如果你在一旁坐著,啥也不干,那么你就是阻塞狀態(tài)。如果在一旁刷網(wǎng)頁,那么就是非阻塞。

所以區(qū)別同步還是異步,主要在于消息的通知方式,阻塞和非阻塞在于函數(shù)調用等待通知時的狀態(tài),即是否掛起,以至于當前的線程或者進程,和還是能否繼續(xù)做別的。

通常還有一種協(xié)程式的方式實現(xiàn)異步非阻塞。即函數(shù)調用遇到IO的時候,注冊回調函數(shù)后,就掛起返回,因為返回了,所以是非阻塞,然后等IO完成了,回調函數(shù)通知喚醒掛起的函數(shù),此時就是異步。

回答3:

一般來說阻塞和非阻塞式指IO調用是立即返回(非阻塞)還是等待完成再返回(阻塞)。同步和異步是個廣義概念,是阻塞和非阻塞的表現(xiàn)。

回答4:

其實你理解的很對,同步就是指不會出現(xiàn)數(shù)據(jù)的不統(tǒng)一,單線程是順序執(zhí)行。不同步就是會出現(xiàn)數(shù)據(jù)不統(tǒng)一的現(xiàn)象,比如多線程的時候,這個線程用到的數(shù)據(jù)可能會被另一個線程給改了,就造成數(shù)據(jù)不同步了。而阻塞和非阻塞是指在線程運行的時候是否等待函數(shù)返回,如果是單線程就會一直等待,如果是多線程的就不等待向下執(zhí)行這個時候就容易出現(xiàn)不同步的情況了。

標簽: java
相關文章:
主站蜘蛛池模板: 一区二区视频网站 | 国产福利91 | 亚洲精品福利视频 | 中文字幕一区在线观看 | 四虎影院在线 | 亚洲欧美视频 | 久久黄色一级片 | www.超碰在线| 天堂av中文在线 | 久久久久一区 | 午夜专区 | 成人国产精品视频 | 日本黄色视 | 毛片网站在线观看 | 谁有毛片网址 | 亚洲黄色精品 | 日本天堂网 | 日韩精品免费看 | 国产精品xxx在线观看 | 一区二区中文 | 国产精品毛片久久久久久久 | 91禁蘑菇在线看 | 天天有av | 国产黄a三级三级看三级 | 人人爽夜夜爽 | 视频爱爱免费视频爱爱太爽 | 久久综合伊人 | 毛片在线观看网站 | www.97超碰 | 自拍偷拍一区二区三区 | 一区二区三区精品 | 玖玖视频 | 日韩一区精品 | 国产又粗又大又爽 | 免费精品视频 | 日本中文字幕在线播放 | 日韩三级一区 | 欧美在线视频观看 | 亚洲精品久久久久 | 亚洲一区二区欧美 | 免费国产黄色 |