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