JavaIO模型中的BIO,NIO和AIO詳解
一、I/O模型
1.1 I/O模型基本說(shuō)明
I/O模型的簡(jiǎn)單理解:I/O模型就是用什么樣的通道進(jìn)行數(shù)據(jù)的發(fā)送和接受,很大程度上決定了程序通信的性能
1.2 Java支持的3種網(wǎng)絡(luò)編程I/O模式
Java共支持3種網(wǎng)絡(luò)編程模型I/O模式:BIO、NIO、AIO
1.3 JavaBIO(同步阻塞)
JavaBIO
:傳統(tǒng)的阻塞模式
同步且阻塞(傳統(tǒng)阻塞性),服務(wù)器實(shí)現(xiàn)模式為一個(gè)連接一個(gè)服務(wù)器,即客戶端有連接請(qǐng)求時(shí)服務(wù)器就需要啟動(dòng)一個(gè)線程進(jìn)行處理,如果這個(gè)連接不做任何事情會(huì)造成不必要的線程開(kāi)銷
下圖為BIO簡(jiǎn)單執(zhí)行流程
傳統(tǒng)的阻塞式
BIO的缺點(diǎn)是客戶端一直在連接服務(wù)器,服務(wù)器會(huì)為每一個(gè)客戶端開(kāi)辟一個(gè)線程對(duì)客戶端處理,但有時(shí)客戶端不是一直對(duì)服務(wù)器進(jìn)行IO操作的,所以這樣會(huì)導(dǎo)致服務(wù)器阻塞,進(jìn)而對(duì)服務(wù)器產(chǎn)生很多不必要的線程開(kāi)銷,資源浪費(fèi)
1.4 JavaNIO (同步非阻塞)
JavaNIO
:同步非阻塞
同步非阻塞,服務(wù)器實(shí)現(xiàn)模式為一個(gè)線程處理多個(gè)請(qǐng)求(連接),即客戶端發(fā)送的連接請(qǐng)求都會(huì)注冊(cè)到多路復(fù)用器上(Selector),多路復(fù)用輪詢到連接有I/O請(qǐng)求就進(jìn)行處理
下圖為NIO簡(jiǎn)單執(zhí)行流程
NIO的優(yōu)點(diǎn)
由于客戶端不是一直對(duì)服務(wù)器進(jìn)行IO操作的,所以通過(guò)Selector選擇器進(jìn)行輪詢,均勻分配到需要對(duì)服務(wù)器進(jìn)行IO操作的客戶端,這樣就利用了客戶端閑置的時(shí)間來(lái)節(jié)省服務(wù)器內(nèi)存的消耗
當(dāng)然,如果客戶端數(shù)量增大,服務(wù)器就要再開(kāi)一個(gè)Thread連接Selector進(jìn)行輪詢分配,以此類推,這樣就充分的減少內(nèi)存消耗
1.5 JavaAIO(異步非阻塞)
JavaAIO
:異步非阻塞
異步非阻塞,AIO引入異步通道的概念,采用了Proactor模式,簡(jiǎn)化了程序編寫,有效的請(qǐng)求才啟動(dòng)線程,它的特點(diǎn)是先由操作系統(tǒng)完成后才通知服務(wù)端程序啟動(dòng)線程去處理,一般適用于連接數(shù)較多且連接時(shí)間較長(zhǎng)的應(yīng)用
AIO目前并沒(méi)有得到廣泛的應(yīng)用
AIO和操作系統(tǒng)有非常密切的關(guān)系
我們就不再進(jìn)行畫圖講解了,AIO了解即可
二、BIO、NIO、AIO適用場(chǎng)景分析
2.1 BIO應(yīng)用場(chǎng)景
BIO方式適用于連接數(shù)目比較少且固定的架構(gòu),這種方式對(duì)服務(wù)器資源要求比較高,并發(fā)局限于應(yīng)用中,JDK1.4 以前的唯一選擇,但程序簡(jiǎn)單易理解
2.2 NIO應(yīng)用場(chǎng)景
NIO方式適用于連接數(shù)目較多且連接比較短(輕操作)的架構(gòu),比如聊天服務(wù)器,彈幕系統(tǒng),服務(wù)器間通訊等,編程比較復(fù)雜,JDK1.4開(kāi)始支持
2.3 AIO應(yīng)用場(chǎng)景
AIO方式使用于連接數(shù)目較多且連接時(shí)間較長(zhǎng)(重操作)的架構(gòu),比如相冊(cè)服務(wù)器,充分調(diào)用OS操作系統(tǒng)參與并發(fā)操作,編程比較復(fù)雜,JDK1.7開(kāi)始支持
總結(jié)
本篇文章就到這里了,希望能夠給你帶來(lái)幫助,也希望您能夠多多關(guān)注腳本之家的更多內(nèi)容!
相關(guān)文章
SpringMVC使用ResponseEntity實(shí)現(xiàn)文件上傳下載
這篇文章主要為大家介紹了SpringMVC使用ResponseEntity實(shí)現(xiàn)文件上傳下載,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-05-05詳解Java的MyBatis框架與Spring框架整合中的映射器注入
映射器注入方式可以將MyBatis與Spring映射好的XML文件實(shí)現(xiàn)配置共用,這里我們就來(lái)詳解Java的MyBatis框架與Spring框架整合中的映射器注入:2016-06-06Java中內(nèi)存異常StackOverflowError與OutOfMemoryError詳解
這篇文章主要介紹了 Java中內(nèi)存異常StackOverflowError與OutOfMemoryError詳解的相關(guān)資料,需要的朋友可以參考下2017-03-03SpringBoot整合JPA數(shù)據(jù)源方法及配置解析
這篇文章主要介紹了SpringBoot整合JPA數(shù)據(jù)源方法及配置解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-08-08Spring深入分析講解BeanUtils的實(shí)現(xiàn)
java知識(shí)體系統(tǒng)有很多數(shù)據(jù)實(shí)體,比較常用的DTO、BO、DO、VO等,其他類似POJO概念太老了現(xiàn)在基本廢棄掉了,本篇幅直接忽略,對(duì)于這幾種數(shù)據(jù)實(shí)體各自代表的含義和應(yīng)用場(chǎng)景先做一下簡(jiǎn)單描述和分析2022-06-06