Java面試|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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM