簡(jiǎn)述JAVA同步、異步、阻塞和非阻塞之間的區(qū)別
同步和異步,阻塞和非阻塞是大家經(jīng)常會(huì)聽(tīng)到的概念,但是它們是從不同維度來(lái)描述一件事情,常常很容易混為一談。
1. 同步和異步
同步和異步描述的是消息通信的機(jī)制。
同步
當(dāng)一個(gè)request發(fā)送出去以后,會(huì)得到一個(gè)response,這整個(gè)過(guò)程就是一個(gè)同步調(diào)用的過(guò)程。哪怕response為空,或者response的返回特別快,但是針對(duì)這一次請(qǐng)求而言就是一個(gè)同步的調(diào)用。
異步
當(dāng)一個(gè)request發(fā)送出去以后,沒(méi)有得到想要的response,而是通過(guò)后面的callback、狀態(tài)或者通知的方式獲得結(jié)果??梢赃@么理解,對(duì)于異步請(qǐng)求分兩步:
1)調(diào)用方發(fā)送request沒(méi)有返回對(duì)應(yīng)的response(可能是一個(gè)空的response);
2)服務(wù)提供方將response處理完成以后通過(guò)callback的方式通知調(diào)用方。
對(duì)于1)而言是同步操作(調(diào)用方請(qǐng)求服務(wù)方),對(duì)于2)而言也是同步操作(服務(wù)方回掉調(diào)用方)。從請(qǐng)求的目的(調(diào)用方發(fā)送一個(gè)request,希望獲得對(duì)應(yīng)的response)來(lái)看,這兩個(gè)步驟拆分開(kāi)來(lái)沒(méi)有任何意義,需要結(jié)合起來(lái)看,而這整個(gè)過(guò)程就是一次異步請(qǐng)求。異步請(qǐng)求有一個(gè)最典型的特點(diǎn):需要callback、狀態(tài)或者通知的方式來(lái)告知調(diào)用方結(jié)果。
2. 阻塞和非阻塞
阻塞和非阻塞描述的是程序在等待調(diào)用結(jié)果(消息,返回值)時(shí)的狀態(tài)。
阻塞
阻塞調(diào)用是指調(diào)用方發(fā)出request的線程因?yàn)槟撤N原因(如:等待系統(tǒng)資源)被服務(wù)方掛起,當(dāng)服務(wù)方得到response后就喚醒掛起線程,并將response返回給調(diào)用方。
非阻塞
非阻塞調(diào)用是指調(diào)用方發(fā)出request的線程在沒(méi)有等到結(jié)果時(shí)不會(huì)被掛起,直到得到response后才返回。
阻塞和非阻塞最大的區(qū)別就是看調(diào)用方線程是否會(huì)被掛起。
3. 同步、異步、阻塞和非阻塞IO
同步阻塞IO
針對(duì)Sender而言,請(qǐng)求發(fā)送出去以后,一直等到Receiver有結(jié)果了才返回,這是同步。在Sender獲取結(jié)果的期間一直被block住了,也就是在此期間Sender不能處理其它事情,這是阻塞。
異步阻塞IO
針對(duì)Sender而言,請(qǐng)求發(fā)送出去以后,立刻返回,然后再等待Receiver的callback,最后再次請(qǐng)求獲取response,這整個(gè)過(guò)程是異步。在Sender等待Receiver的callback期間一直被block住了,也就是在此期間Sender不能處理其它事情,這是阻塞。
同步非阻塞IO
針對(duì)Sender而言,請(qǐng)求發(fā)送出去以后,立刻返回,然后再不停的發(fā)送請(qǐng)求,直到Receiver處理好結(jié)果后,最后一次發(fā)請(qǐng)求給Receiver才獲得response。Sender一直在主動(dòng)輪詢,每一個(gè)請(qǐng)求都是同步的,整個(gè)過(guò)程也是同步的。在Sender等待Receiver的response期間一直是可以處理其它事情的(比如:可以發(fā)送請(qǐng)求詢問(wèn)結(jié)果),這是非阻塞。
異步非阻塞IO
針對(duì)Sender而言,請(qǐng)求發(fā)送出去以后,立刻返回,然后再等待Receiver的callback,最后再次請(qǐng)求獲取response,這整個(gè)過(guò)程是異步。在Sender等待Receiver的callback期間一直是可以處理其它事情的,這是非阻塞。
總結(jié)
- 同步和異步就看調(diào)用方是否需要通過(guò)callback、通知或者狀態(tài)來(lái)獲取結(jié)果
- 阻塞和非阻塞就看調(diào)用方在發(fā)送請(qǐng)求后是否block住了
以上就是簡(jiǎn)述JAVA同步、異步、阻塞和非阻塞之間的區(qū)別的詳細(xì)內(nèi)容,更多關(guān)于JAVA同步、異步、阻塞和非阻塞的區(qū)別的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
java中String與StringBuilder的區(qū)別
本篇文章介紹了,java中String與StringBuilder的區(qū)別。需要的朋友參考下2013-04-04Java設(shè)計(jì)模式之原型模式詳細(xì)解讀
這篇文章主要介紹了Java設(shè)計(jì)模式之原型模式詳細(xì)解讀,原型模式屬于創(chuàng)建型設(shè)計(jì)模式,用于創(chuàng)建重復(fù)的對(duì)象,且同時(shí)又保證了性能,該設(shè)計(jì)模式的好處是將對(duì)象的創(chuàng)建與調(diào)用方分離,需要的朋友可以參考下2023-12-12Java對(duì)象數(shù)組的添加、刪除和遍歷代碼示例
在Java編程中,我們經(jīng)常需要對(duì)數(shù)據(jù)結(jié)構(gòu)進(jìn)行遍歷操作,并根據(jù)業(yè)務(wù)需求刪除部分元素,這篇文章主要給大家介紹了關(guān)于Java對(duì)象數(shù)組的添加、刪除和遍歷的相關(guān)資料,需要的朋友可以參考下2024-04-04一些java二進(jìn)制的相關(guān)基礎(chǔ)知識(shí)
這篇文章主要介紹了一些java二進(jìn)制的相關(guān)基礎(chǔ)知識(shí),在Java語(yǔ)言中byte代表最小計(jì)量單位,byte由8位2進(jìn)制數(shù)組成。,需要的朋友可以參考下2019-06-06SpringMvc切換Json轉(zhuǎn)換工具的操作代碼
SpringBoot切換使用goolge的Gson作為SpringMvc的Json轉(zhuǎn)換工具,本文給大家講解SpringMvc切換Json轉(zhuǎn)換工具的操作代碼,感興趣的朋友一起看看吧2024-02-02Java程序連接數(shù)據(jù)庫(kù)的常用的類和接口介紹
這篇文章主要介紹了Java程序連接數(shù)據(jù)庫(kù)的常用的類和接口,包括Connection類和Statement類等,需要的朋友可以參考下2015-10-10在Java中輕松將HTML格式文本轉(zhuǎn)換為純文本的方法示例(保留換行)
這篇文章主要介紹了在Java中輕松將HTML格式文本轉(zhuǎn)換為純文本的方法示例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-04-04由ArrayList來(lái)深入理解Java中的fail-fast機(jī)制
fail-fast俗稱快速失敗,是在多線程進(jìn)行迭代操作時(shí)產(chǎn)生沖突的一種異常拋出機(jī)制,下面我們就由ArrayList來(lái)深入理解Java中的fail-fast機(jī)制.2016-05-05