1. 程式人生 > 其它 >Java面試|BIO、NIO、AIO的區別和應用場景

Java面試|BIO、NIO、AIO的區別和應用場景

BIO是一個連線一個執行緒,NIO是一個請求一個執行緒,AIO是一個有效請求一個執行緒。

摘要:BIO是一個連線一個執行緒,NIO是一個請求一個執行緒,AIO是一個有效請求一個執行緒。

  在學習Java I/O類庫時,容易混淆NIO、BIO、AIO這幾個概念,同時對於阻塞和非阻塞、同步和非同步的理解也較為晦澀,這篇文章是對這幾個概念的一些區分以及個人的一些見解。

BIO

  Blocking I/O,同步阻塞I/O模型,伺服器實現模式為一個連線一個執行緒,即客戶端有連線請求時伺服器端就需要啟動一個執行緒進行處理,如果這個連線不做任何事情會造成不必要的執行緒開銷,當然可以通過執行緒池機制改善。應用場景:適用於連線數目比較小且固定的架構,這種方式對服務端資源要求比較高,併發侷限於應用中,在JDK 1.4以前是唯一的I/O實現,但程式直觀簡單易理解。

  通俗理解為資料的讀取寫入必修阻塞在一個執行緒內,直到其完成。

NIO

  New I/O,同步非阻塞I/O模型,伺服器實現模式為一個請求一個執行緒,即客戶端傳送的連線請求都會註冊到多路複用器上,多路複用器輪詢到連線有I/O請求時才啟動一個執行緒進行處理。應用場景:NIO方式適用於連線數目多且連線比較短(輕操作)的架構,比如聊天伺服器,併發侷限於應用中,程式設計比較複雜,JDK 1.4開始支援。

  是傳統I/O的升級版,客戶端和服務端通過Channel(通道)通訊,實現了多路複用。

NIO採用的是一種多路複用的機制,利用單執行緒輪詢事件,高效定位就緒的Channel來決定做什麼,只是Select階段是阻塞式的,能有效避免大量連線數時,頻繁執行緒的切換帶來的效能或各種問題。

AIO

  Asynchronous I/O,非同步非阻塞I/O模型,伺服器實現模式為一個有效請求一個執行緒,客戶端的 I/O 請求都是由 OS 先完成了再通知伺服器應用啟動執行緒進行處理。 應用場景:適用於連線數目多且連線比較長(重操作)的架構,比如相簿伺服器,充分呼叫OS參與併發操作,程式設計比較複雜,JDK 7 開始支援。

IO與NIO區別

  IO面向流,NIO面向緩衝區;IO的各種流是阻塞I/O模型,NIO是非阻塞I/O模型。

  NIO的選擇允許一個單獨的執行緒來監視多個輸入通道,可以註冊多個通道使用一個選擇器,然後使用一個單獨的執行緒來“選擇”通道:這些通道里已經有可以處理的輸入或選擇已準備寫入的通道。這種選擇機制,使得一個單獨的執行緒很容易來管理多個通道。

小結

  Java 中的 BIO、NIO和 AIO 是 Java 語言對作業系統中各種 I/O 模型的封裝。我們在使用這些 API 的時候,不需要關心作業系統層面的知識,也不需要根據不同作業系統編寫不同的程式碼,只需要呼叫Java的API就足矣!

  以上就是這篇文章的全部內容了,希望本文對大家的學習或者工作具有一定的參考和學習價值;如果有疑問,大家可以在評論區留言交流,也希望大家多多點贊關注。謝謝大家對樓蘭胡楊的支援!

Reference


  讀後有收穫,小禮物走一走,請作者喝咖啡。

讚賞支援