Java BIO、NIO、AIO的区别
一、基礎(chǔ)概念
同步:是指的是用戶進(jìn)程觸發(fā)IO操作并等待或者輪詢的去查看IO操作是否就緒。
異步:是指用戶進(jìn)程觸發(fā)IO操作以后便開始做自己的事情,而當(dāng)IO操作已經(jīng)完成的時(shí)候會得到IO完成的通知(異步的特點(diǎn)就是通知)。(使用異步IO時(shí),Java將IO讀寫委托給OS處理,需要將數(shù)據(jù)緩沖區(qū)地址和大小傳給OS)?
阻塞:是指當(dāng)試圖對該文件描述符進(jìn)行讀寫時(shí),如果當(dāng)時(shí)沒有東西可讀,或者暫時(shí)不可寫,程序就進(jìn)入等待狀態(tài),直到有東西可讀或者可寫為止。
非阻塞:在非阻塞狀態(tài)下,如果沒有東西可讀,或者不可寫,讀寫函數(shù)馬上返回,而不會等待。
二、BIO、NIO、AIO
Java BIO : 同步并阻塞。服務(wù)器實(shí)現(xiàn)模式為一個(gè)連接一個(gè)線程,即客戶端有連接請求時(shí)服務(wù)器端就需要啟動一個(gè)線程進(jìn)行處理,如果這個(gè)連接不做任何事情會造成不必要的線程開銷,當(dāng)然可以通過線程池機(jī)制改善。
Java NIO : 同步非阻塞。服務(wù)器實(shí)現(xiàn)模式為一個(gè)請求一個(gè)線程,即客戶端發(fā)送的連接請求都會注冊到多路復(fù)用器上,多路復(fù)用器輪詢到連接有I/O請求時(shí)才啟動一個(gè)線程進(jìn)行處理。
Java AIO(NIO.2) : 異步非阻塞。服務(wù)器實(shí)現(xiàn)模式為一個(gè)有效請求一個(gè)線程,客戶端的I/O請求都是由OS先完成了再通知服務(wù)器應(yīng)用去啟動線程進(jìn)行處理。
三、使用場景
BIO、NIO、AIO適用場景分析:
BIO方式適用于連接數(shù)目比較小且固定的架構(gòu),這種方式對服務(wù)器資源要求比較高,并發(fā)局限于應(yīng)用中,JDK1.4以前的唯一選擇,但程序直觀簡單易理解。
NIO方式適用于連接數(shù)目多且連接比較短(輕操作)的架構(gòu),比如聊天服務(wù)器,并發(fā)局限于應(yīng)用中,編程比較復(fù)雜,JDK1.4開始支持。
AIO方式使用于連接數(shù)目多且連接比較長(重操作)的架構(gòu),比如相冊服務(wù)器,充分調(diào)用OS參與并發(fā)操作,編程比較復(fù)雜,JDK7開始支持。
四、I/O多路復(fù)用模式
兩種I/O多路復(fù)用模式:Reactor模式和Proactor模式
一般地,I/O多路復(fù)用機(jī)制都依賴于一個(gè)事件多路分離器(Event Demultiplexer)。分離器對象可將來自事件源的I/O事件分離出來,并分發(fā)到對應(yīng)的read/write事件處理器(Event Handler)。開發(fā)人員預(yù)先注冊需要處理的事件及其事件處理器(或回調(diào)函數(shù));事件分離器負(fù)責(zé)將請求事件傳遞給事件處理器。兩個(gè)與事件分離器有關(guān)的模式是Reactor和Proactor。
Reactor模式采用同步IO,而Proactor采用異步IO。
模擬的Reactor模式:
步驟 1) 等待事件 (Reactor 的工作)
步驟 2) 發(fā)"已經(jīng)可讀"事件發(fā)給事先注冊的事件處理者或者回調(diào) ( Reactor 要做的)
步驟 3) 讀數(shù)據(jù) (用戶代碼要做的)
步驟 4) 處理數(shù)據(jù) (用戶代碼要做的)
模擬的Proactor模式:
步驟 1) 等待事件 (Proactor 的工作)
步驟 2) 讀數(shù)據(jù)(看,這里變成成了讓 Proactor 做這個(gè)事情)
步驟 3) 把數(shù)據(jù)已經(jīng)準(zhǔn)備好的消息給用戶處理函數(shù),即事件處理者(Proactor 要做的)
步驟 4) 處理數(shù)據(jù) (用戶代碼要做的)
總結(jié)
以上是生活随笔為你收集整理的Java BIO、NIO、AIO的区别的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 南五味子的功效与作用
- 下一篇: 摘隐形眼镜的方法