基礎 | BIO、NIO與AIO
Java中的IO部分比較複雜,具體可參看書籍《Java NIO》和《Netty權威指南》。在此,僅對BIO、NIO和AIO進行概述性梳理,未涉及到具體實現細節,後續有空將深入展開。
同步IO和非同步IO
參考答案:
IO操作主要分為兩個步驟,即發起IO請求和實際IO操作,同步IO與非同步IO的區別就在於第二個步驟是否阻塞。
若實際IO操作阻塞請求程序,即請求程序需要等待或者輪詢檢視IO操作是否就緒,則為同步IO。
若實際IO操作並不阻塞請求程序,而是由作業系統來進行實際IO操作並將結果返回,則為非同步IO。
阻塞IO和非阻塞IO
參考答案:
IO操作主要分為兩個步驟,即發起IO請求和實際IO操作,阻塞IO與非阻塞IO的區別就在於第一個步驟是否阻塞。
若發起IO請求後請求執行緒一直等待實際IO操作完成,則為阻塞IO。
若發起IO請求後請求執行緒返回而不會一直等待,即為非阻塞IO。
BIO、NIO和AIO
參考答案:
BIO表示同步阻塞式IO,伺服器實現模式為一個連線一個執行緒,即客戶端有連線請求時伺服器端就需要啟動一個執行緒進行處理,如果這個連線不做任何事情會造成不必要的執行緒開銷,當然可以通過執行緒池機制改善。
NIO表示同步非阻塞IO,伺服器實現模式為一個請求一個執行緒,即客戶端傳送的連線請求都會註冊到多路複用器上,多路複用器輪詢到連線有I/O請求時才啟動一個執行緒進行處理。
AIO表示非同步非阻塞IO,伺服器實現模式為一個有效請求一個執行緒,客戶端的I/O請求都是由作業系統先完成IO操作後再通知伺服器應用來啟動執行緒進行處理。
應用場景:
- BIO適用於連線數目比較小且固定的架構,該方式對伺服器資源要求比較高,JDK 1.4以前的唯一選擇。
- NIO適用於連線數目多且連線比較短(輕操作)的架構,如聊天伺服器,程式設計複雜,JDK 1.4開始支援,如在Netty框架中使用。
- AIO適用於連線數目多且連線比較長(重操作)的架構,如相簿伺服器,充分呼叫作業系統參與併發操作,程式設計複雜,JDK 1.7開始支援。
備註:在大多數場景下,不建議直接使用JDK的NIO類庫(門檻很高),除非精通NIO程式設計或者有特殊的需求。在絕大多數的業務場景中,可以使用NIO框架Netty來進行NIO程式設計,其既可以作為客戶端也可以作為服務端,且支援UDP和非同步檔案傳輸,功能非常強大。
擴充套件面試題
問:談一談對同步IO和與非同步IO的理解?
- 同步是指使用者程序觸發IO操作並等待或輪詢檢視IO操作是否就緒。
- 非同步是指使用者程序觸發IO操作後便開始做其他事情,當IO操作完成時使用者程序會得到相應的通知。
問:談一談對阻塞與非阻塞的理解(針對IO操作)?
- 在阻塞狀態下,如果沒有東西可讀或不可寫,讀寫函式將進入等待狀態,直到有東西可讀或可寫再返回。
- 非阻塞狀態下,如果沒有東西可讀或不可寫,讀寫函式馬上返回,而並不會等待。
特殊說明:
以上兩個題的參考答案僅供大家參考,與「BIO、NIO和AIO」部分的參考答案類似,只是個人覺得後者更有助於理解。另外,IO操作部分涉及的內容真的很多,此次僅為概述性總結,後續有機會重點展開。
推薦閱讀
- String、StringBuffer與StringBuilder
- Exception與Error
- final、finally與finalize
- Java序列化與反序列化的底層實現
- Java中四種引用的區別
歡迎關注
Java名企面試吧,隔天10點24分,我們不見不散!
丙子先生的宗旨是,每兩天以短篇幅講高頻面試題,不增加太多負擔,但需要持之以恆。
能力有限,歡迎指教!