濮阳杆衣贸易有限公司

主頁 > 知識庫 > 一篇文章理解阻塞、非阻塞、同步、異步

一篇文章理解阻塞、非阻塞、同步、異步

熱門標(biāo)簽:交行外呼系統(tǒng)有哪些 隨州銷售外呼系統(tǒng)平臺 激戰(zhàn)黃昏地圖標(biāo)注說明 不同的地圖標(biāo)注 防城港市ai電銷機(jī)器人 寧夏保險(xiǎn)智能外呼系統(tǒng)哪家好 怎么更改地圖標(biāo)注電話 臨滄移動外呼系統(tǒng)哪家有 溫嶺代理外呼系統(tǒng)

理解阻塞、非阻塞、同步、異步

首先說明,這些都是在特點(diǎn)場景下或者相對情況的詞匯,OK,接下來開門見山。

阻塞

可以很直觀的理解,就如節(jié)假日高速路出口收費(fèi)站一樣,上圖片:

9個(gè)收費(fèi)亭,同時(shí)來了一大波車,這時(shí)候同一時(shí)刻只能有9輛車在收費(fèi),剩下的車都在只能在后面排隊(duì)等待,這就是現(xiàn)實(shí)中很直觀的阻塞現(xiàn)象。這9個(gè)收費(fèi)亭,就是一個(gè)瓶頸,或許畫為這樣更符合大家對瓶頸二字的理解:

第1張圖中,高速公路源源不斷的車輛到來,和第二張圖的效果其實(shí)表示一樣。

OK,看圖明白了現(xiàn)象,分析一下為什么會阻塞?

1.數(shù)量上:

到來車輛數(shù)——大量

收費(fèi)站數(shù)——小于等于9個(gè)

結(jié)論:在要過卡的汽車數(shù)量大于收費(fèi)亭數(shù)量時(shí),就會有阻塞現(xiàn)象。

2.速度上:

到來車輛速度——快速

收費(fèi)站過卡速度——慢

結(jié)論:在收費(fèi)站過卡速度比車輛到來的速度慢時(shí),就會有阻塞現(xiàn)象。

綜合起來就是:因?yàn)榱坎詈退俣炔睿瑢?dǎo)致阻塞現(xiàn)象。

思考問題,為什么會有量差?

因?yàn)橛行┵Y源是有限的,是很難避免的,高速公路出口區(qū)域的大小有限,收費(fèi)亭的個(gè)數(shù)會根據(jù)合理的規(guī)劃設(shè)立,即使設(shè)立了1千個(gè)收費(fèi)亭,從高速路到來的汽車跑到距離最遠(yuǎn)的那個(gè)收費(fèi)亭也是相當(dāng)遠(yuǎn),沒有車主愿意跑那么遠(yuǎn)去收費(fèi),它就形同虛設(shè),有效收費(fèi)亭數(shù)就還是一個(gè)相對很小的數(shù)量。同時(shí),還需要考慮成本因素。

在程序里,比如數(shù)據(jù)庫連接池里的連接是有限的,比如10條連接,但1毫秒內(nèi)需要做1000個(gè)查詢,就會形成阻塞現(xiàn)象。

而速度差是客觀存在的,收費(fèi)亭還需要經(jīng)過不斷的發(fā)展,才能達(dá)到和高速公路相匹配的速度,但收費(fèi)亭還有一個(gè)作用就是讓高速的車輛減速下來,去匹配非高速公路的速度。

在程序里,數(shù)據(jù)庫查詢,需要經(jīng)過網(wǎng)絡(luò)IO和磁盤IO,相同的內(nèi)容怎么都比在本機(jī)內(nèi)存中直接檢索出來要慢。

阻塞,其實(shí)是一個(gè)客觀存在的現(xiàn)象,它本質(zhì)上是沒法繞開的。

既然繞不開,那……非阻塞又是什么?

非阻塞

還是上面的例子,車輛經(jīng)過高速路收費(fèi)亭,非阻塞更像是改版的ETC,車輛進(jìn)高速,掃一下車牌登記一下,車輛離開高速,掃一下車牌登記一下,然后車輛離開了,開出個(gè)幾百米后車主手機(jī)才收到ETC被扣費(fèi)的短信,此時(shí)高速路收費(fèi)才算完成。整個(gè)過程,停留的時(shí)間很短,如果車牌識別效率非常高,甚至可以把車卡的桿去掉,這樣車輛就無需停留。

無需停留即速度與車輛到來速度相匹配,即沒有阻塞現(xiàn)象。

那是真的沒有阻塞了嗎?怎么可能,只是從車的角度來看,車確實(shí)不阻塞了,但從整個(gè)收費(fèi)程序來看,車輛跑出幾百米后才收費(fèi)成功,就表示實(shí)際上自動扣費(fèi)的速度比較慢,阻塞范圍縮小到了自動扣費(fèi)上。

把阻塞范圍縮小,縮短主體停留時(shí)間,就是非阻塞要做的事情。

到這里,先記住這個(gè)結(jié)論,先折起一小部分內(nèi)容留最后總結(jié)聯(lián)系上下文……

同步

下班回家到家門口的時(shí)候,開門經(jīng)過以下步驟:

  • 1.掏鑰匙(還需要從幾百把鑰匙里挑選鑰匙請忽略鑰匙的步驟)
  • 2.插入門鎖孔(磁卡鎖、指紋鎖、人臉鎖等,請積極回憶用鑰匙的日子)
  • 3.旋轉(zhuǎn)鑰匙,開門

正常來說,三個(gè)步驟是順序依賴的,這三步驟你怎么換人分著做,都會等待前一個(gè)步驟完成。

這時(shí)候,如果沒有別的事情干擾,基本上我們會一個(gè)人去完成整個(gè)開門的事情,因?yàn)閾Q人,也需要時(shí)間。

開門的人,看作一個(gè)主體;整個(gè)開門過程,可以看作一個(gè)事務(wù)。那么:

一個(gè)主體獨(dú)自完成一個(gè)事務(wù),便可以認(rèn)為這個(gè)過程是同步的。

在程序里,給員工張三發(fā)一個(gè)節(jié)日祝福短信,步驟相似:

public static void main(String[] args) {
        // 給員工張三發(fā)一個(gè)節(jié)日祝福短信,步驟相似:

        // 1. 先把員工張三的信息查找出來
        Employee employee = findEmployee("張三");

        // 2. 編輯短信:”祝張三先生節(jié)日快樂,闔家幸福!“
        String message = "祝張三" + employee.getGender() + "節(jié)日快樂,闔家幸福!";

        // 3. 調(diào)用短信發(fā)送API發(fā)送短信內(nèi)容到員工的手機(jī)號碼
        sendMessage(employee.getPhone(), message);
    }

1.先把員工張三的信息查找出來

2.編輯短信:”祝張三先生節(jié)日快樂,闔家幸福!“

3.調(diào)用短信發(fā)送API發(fā)送短信內(nèi)容到員工的手機(jī)號碼

整個(gè)事務(wù)都在一條線程里順序完成,則屬于同步操作。

同步的核心,是一個(gè)主體。主要看你把什么定為一個(gè)主體。

異步

接著上面,同步是一個(gè)主體做事,那么異步,就是多個(gè)主體做事。

比如開門的例子,如果把主體具體到手,右手在做開門這些步驟時(shí),左手可能在摘下口罩,這時(shí)候兩件事情都不沖突,摘下口罩后,還可以撓撓頭,抓抓癢,左手可以為所欲為(左手千萬別掰斷右手)。

同一時(shí)刻,多個(gè)主體在做事,就屬于異步。

在程序里,線程1給張三發(fā)節(jié)日祝福短信,線程2給李四發(fā)節(jié)日祝福短信,線程3給王五發(fā),完全沒有問題,為所欲為有木有。

當(dāng)然,如果多個(gè)線程在做相同的事情,也可以叫并發(fā)。

思考問題,什么時(shí)候建議異步?

當(dāng)多個(gè)事情沒有沖突,而你又有足夠的資源去同時(shí)展開工作時(shí)。

比如邊開門邊撓頭的例子,如果你的左手因?yàn)閿?shù)錢導(dǎo)致短暫性發(fā)麻無力,只有右手可以活動,那么邊開門邊撓頭只會讓你在切換這兩件事的時(shí)候花費(fèi)更多的時(shí)間。

在代碼里,如果想要給張三同時(shí)發(fā)出去短信和郵件,則可以使用異步的方式去實(shí)現(xiàn):

public static void main(String[] args) {
        // 給員工張三發(fā)一個(gè)節(jié)日祝福短信,步驟相似:

        // 1. 先把員工張三的信息查找出來
        Employee employee = findEmployee("張三");

        // 開啟線程2去發(fā)郵件
        new Thread(() -> {// 這里邊的就是異步操作
            // 編輯郵件
            String mailMessage = "祝h3>張三/h3>" + employee.getGender() + "節(jié)日快樂,闔家幸福!";
            // 發(fā)送郵件
            sendEmail(employee.getEmail(), mailMessage);
        }).start();

        // 2. 編輯短信:”祝張三先生節(jié)日快樂,闔家幸福!“
        String message = "祝張三" + employee.getGender() + "節(jié)日快樂,闔家幸福!";

        // 3. 調(diào)用短信發(fā)送API發(fā)送短信內(nèi)容到員工的手機(jī)號碼
        sendMessage(employee.getPhone(), message);
    }

1.先把員工張三的信息查找出來

2.線程1(main線程):編輯短信;線程2:編輯郵件

3.線程1(main線程):發(fā)送短信;線程2:發(fā)送郵件

線程2在start()后,main線程就可以繼續(xù)往下執(zhí)行了,main線程并不會等待線程2執(zhí)行完成,也就是說,異步有一個(gè)特點(diǎn)——非阻塞。

異步可以加上回調(diào)這個(gè)利器,在執(zhí)行出結(jié)果時(shí),通過回調(diào)的方式,去反饋結(jié)果,這里不展開細(xì)談。

總結(jié)

因?yàn)椴糠仲Y源有限,所以阻塞客觀存在的,可以簡單的理解為有排隊(duì)等待的現(xiàn)象,就是阻塞。

非阻塞主要是把阻塞范圍縮小,或者把可以延遲完成的事情異步完成,縮短主體停留時(shí)間。

最后回到收費(fèi)亭的非阻塞例子,車輛在經(jīng)過出高速的收費(fèi)亭登記后,就讓另一條線程去執(zhí)行收費(fèi)操作,并不影響車輛通行,等車輛行駛出幾百米后,異步的線程執(zhí)行完畢,短信也發(fā)到了車主的手機(jī)上。

多加一些思考就能發(fā)現(xiàn),因?yàn)樗俣仁窍鄬Φ?,阻塞也是相對的,收費(fèi)亭A的速度慢,但是對于它自己來說,它已經(jīng)是全速了,它沒停過就沒有阻塞,但是高速路到來B的車因?yàn)樗O聛淼却?,所以阻塞須有A和B相互參照,才能看出誰是瓶頸。

同步和異步,也是相對的,這取決于主體的粒度,應(yīng)用服務(wù)里A有100條線程在協(xié)同完成任務(wù)X,主體為線程時(shí),他們是異步的,但當(dāng)你把整個(gè)服務(wù)A看作一個(gè)整體時(shí),他是同步的,因?yàn)椴还苣銉?nèi)部有多少線程,你都只是完成了任務(wù)X,僅由一個(gè)主體,完成一個(gè)事務(wù),就是同步。

運(yùn)用這些思維,可以很好的去理解阻塞隊(duì)列、線程池、連接池等組件,以后有空再展開吧。

以上就是一篇文章理解阻塞、非阻塞、同步、異步的詳細(xì)內(nèi)容,更多關(guān)于阻塞、非阻塞、同步、異步的資料請關(guān)注腳本之家其它相關(guān)文章!

您可能感興趣的文章:
  • 簡述JAVA同步、異步、阻塞和非阻塞之間的區(qū)別
  • java 中同步、異步、阻塞和非阻塞區(qū)別詳解
  • java 同步、異步、阻塞和非阻塞分析
  • 詳解socket阻塞與非阻塞,同步與異步、I/O模型
  • 淺談socket同步和異步、阻塞和非阻塞、I/O模型
  • 科學(xué)知識:同步、異步、阻塞和非阻塞區(qū)別

標(biāo)簽:無錫 阜陽 青海 沈陽 河源 哈密 紅河 忻州

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《一篇文章理解阻塞、非阻塞、同步、異步》,本文關(guān)鍵詞  一篇,文章,理解,阻塞,非,;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問題,煩請?zhí)峁┫嚓P(guān)信息告之我們,我們將及時(shí)溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無關(guān)。
  • 相關(guān)文章
  • 下面列出與本文章《一篇文章理解阻塞、非阻塞、同步、異步》相關(guān)的同類信息!
  • 本頁收集關(guān)于一篇文章理解阻塞、非阻塞、同步、異步的相關(guān)信息資訊供網(wǎng)民參考!
  • 推薦文章
    页游| 渭源县| 印江| 登封市| 年辖:市辖区| 临澧县| 萝北县| 宝山区| 若羌县| 金阳县| 建阳市| 迁西县| 望城县| 阜康市| 禹城市| 江城| 汉寿县| 图片| 胶南市| 定结县| 吴忠市| 内乡县| 南部县| 乐东| 旬阳县| 耿马| 凯里市| 姜堰市| 伊金霍洛旗| 桦川县| 河东区| 洛南县| 嘉鱼县| 嘉禾县| 亚东县| 寿光市| 高清| 永春县| 遂溪县| 尚义县| 临清市|