一、基本概念
IO:阻塞IO
BIO:同步阻塞IO。伺服器實作模式為一個連接配接一個線程,即用戶端有連接配接請求時伺服器需要啟動一個線程進行處理,如果這個連結不做任何事情會造成不必要的線程開銷,當然可以通過線程池機制改善。
NIO:同步非阻塞IO,伺服器實作模式為一個請求一個線程,即用戶端發送的連接配接請求都會注冊到多路複用器上,多路複用器輪詢到連接配接有IO請求時才啟動一個線程進行處理。使用者程序也需要時不時的詢問IO操作是否就緒,這需要使用者進行不停的去詢問。NIO的包括三個核心概念:緩沖區(Buffer)、通道(Channel)、選擇器(Selector)。
AIO:Asynchronous IO,異步非阻塞AIO。最大的特性時具有異步能力,這種能力對socket與檔案I/O都起作用。AIO其實是一種在讀寫操作結束之前允許進行其他操作的I/O處理。
可概括為:BIO是“我要讀”,NIO是“我可以讀了”,AIO是“我讀完了”
二、差別
(1)NIO和IO的主要差別
IO | NIO |
面向流 | 面向緩沖區 |
阻塞 | 非阻塞 |
無 | 選擇器 |
(2)BIO,NIO,AIO對比
同步阻塞IO(VIO) | 非阻塞IO(NIO) | 異步IO(AIO) | |
用戶端個數:IO線程 | 1:1 | M:1(1個IO線程處理多個用戶端連接配接) | M:0(不需要啟動額外的IO線程,被動回調) |
IO類型(阻塞) | 阻塞 | 非阻塞 | 非阻塞 |
IO類型(同步) | 同步 | 同步 | 異步 |
API使用難度 | 簡單 | 簡單 | 複雜 |
調試難度 | 簡單 | 簡單 | 複雜 |
可靠性 | 非常差 | 差 | 高 |
吞吐量 | 低 | 中 | 高 |
三、應用場景
BIO:适用于連接配接數目比較小且固定的架構,這種方式對伺服器資源要求比較高,并發局限于應用中,JDK1.4之前的唯一選擇, 但是程式簡單直覺容易了解。
NIO:适用于連接配接數目多且連接配接比較短(輕操作)的架構,比如聊推薦伺服器,并發局限于應用中,程式設計比較複雜,JDK1.4開始支援。
AIO:适用于連接配接數目多且連接配接比較長(重操作)的架構,比如相冊伺服器,充分調用OS參與并發操作,程式設計比較複雜,JDK1.7開始支援。