簡述JAVA同步、異步、阻塞和非阻塞之間的區(qū)別
同步和異步,阻塞和非阻塞是大家經(jīng)常會聽到的概念,但是它們是從不同維度來描述一件事情,常常很容易混為一談。
1. 同步和異步
同步和異步描述的是消息通信的機制。
同步
當(dāng)一個request發(fā)送出去以后,會得到一個response,這整個過程就是一個同步調(diào)用的過程。哪怕response為空,或者response的返回特別快,但是針對這一次請求而言就是一個同步的調(diào)用。
異步
當(dāng)一個request發(fā)送出去以后,沒有得到想要的response,而是通過后面的callback、狀態(tài)或者通知的方式獲得結(jié)果。可以這么理解,對于異步請求分兩步:
1)調(diào)用方發(fā)送request沒有返回對應(yīng)的response(可能是一個空的response);
2)服務(wù)提供方將response處理完成以后通過callback的方式通知調(diào)用方。
對于1)而言是同步操作(調(diào)用方請求服務(wù)方),對于2)而言也是同步操作(服務(wù)方回掉調(diào)用方)。從請求的目的(調(diào)用方發(fā)送一個request,希望獲得對應(yīng)的response)來看,這兩個步驟拆分開來沒有任何意義,需要結(jié)合起來看,而這整個過程就是一次異步請求。異步請求有一個最典型的特點:需要callback、狀態(tài)或者通知的方式來告知調(diào)用方結(jié)果。
2. 阻塞和非阻塞
阻塞和非阻塞描述的是程序在等待調(diào)用結(jié)果(消息,返回值)時的狀態(tài)。
阻塞
阻塞調(diào)用是指調(diào)用方發(fā)出request的線程因為某種原因(如:等待系統(tǒng)資源)被服務(wù)方掛起,當(dāng)服務(wù)方得到response后就喚醒掛起線程,并將response返回給調(diào)用方。
非阻塞
非阻塞調(diào)用是指調(diào)用方發(fā)出request的線程在沒有等到結(jié)果時不會被掛起,直到得到response后才返回。
阻塞和非阻塞最大的區(qū)別就是看調(diào)用方線程是否會被掛起。
3. 同步、異步、阻塞和非阻塞IO
同步阻塞IO
針對Sender而言,請求發(fā)送出去以后,一直等到Receiver有結(jié)果了才返回,這是同步。在Sender獲取結(jié)果的期間一直被block住了,也就是在此期間Sender不能處理其它事情,這是阻塞。
異步阻塞IO
針對Sender而言,請求發(fā)送出去以后,立刻返回,然后再等待Receiver的callback,最后再次請求獲取response,這整個過程是異步。在Sender等待Receiver的callback期間一直被block住了,也就是在此期間Sender不能處理其它事情,這是阻塞。
同步非阻塞IO
針對Sender而言,請求發(fā)送出去以后,立刻返回,然后再不停的發(fā)送請求,直到Receiver處理好結(jié)果后,最后一次發(fā)請求給Receiver才獲得response。Sender一直在主動輪詢,每一個請求都是同步的,整個過程也是同步的。在Sender等待Receiver的response期間一直是可以處理其它事情的(比如:可以發(fā)送請求詢問結(jié)果),這是非阻塞。
異步非阻塞IO
針對Sender而言,請求發(fā)送出去以后,立刻返回,然后再等待Receiver的callback,最后再次請求獲取response,這整個過程是異步。在Sender等待Receiver的callback期間一直是可以處理其它事情的,這是非阻塞。
總結(jié)
同步和異步就看調(diào)用方是否需要通過callback、通知或者狀態(tài)來獲取結(jié)果 阻塞和非阻塞就看調(diào)用方在發(fā)送請求后是否block住了以上就是簡述JAVA同步、異步、阻塞和非阻塞之間的區(qū)別的詳細(xì)內(nèi)容,更多關(guān)于JAVA同步、異步、阻塞和非阻塞的區(qū)別的資料請關(guān)注好吧啦網(wǎng)其它相關(guān)文章!
相關(guān)文章:
1. Redis Java Lettuce驅(qū)動框架原理解析2. Python中Anaconda3 安裝gdal庫的方法3. Python自動化之定位方法大殺器xpath4. python用zip壓縮與解壓縮5. JAVA如何轉(zhuǎn)換樹結(jié)構(gòu)數(shù)據(jù)代碼實例6. python公司內(nèi)項目對接釘釘審批流程的實現(xiàn)7. Notepad++如何配置python?配置python操作流程詳解8. Python 簡介9. Python操作Excel工作簿的示例代碼(*.xlsx)10. Python importlib模塊重載使用方法詳解
