1. 程式人生 > >Java中BIO、NIO和AIO的區別和應用場景

Java中BIO、NIO和AIO的區別和應用場景

最近一直在準備面試,為了使自己的Java水平更上一個檔次,拜讀了李林峰老師的《Netty權威指南》,瞭解了Java關於IO的發展和最新的技術,真是受益匪淺,現在把我總結的關於BIO、NIO和AIO的區別和應用場景概述一遍。

在此之前,先弄清幾個概念:

1.同步:使用同步IO時,Java自己處理IO讀寫。

2.非同步:使用非同步IO時,Java將IO讀寫委託給OS處理,需要將資料緩衝區地址和大小傳給OS,完成後OS通知Java處理(回撥)。

3.阻塞:使用阻塞IO時,Java呼叫會一直阻塞到讀寫完成才返回。

4.非阻塞:使用非阻塞IO時,如果不能立馬讀寫,Java呼叫會馬上返回,當IO事件分發器通知可讀寫時在進行讀寫,不斷迴圈直到讀寫完成。

下面是重點了(敲黑板!)!

1.BIO:同步並阻塞,伺服器的實現模式是一個連線一個執行緒,這樣的模式很明顯的一個缺陷是:由於客戶端連線數與伺服器執行緒數成正比關係,可能造成不必要的執行緒開銷,嚴重的還將導致伺服器記憶體溢位。當然,這種情況可以通過執行緒池機制改善,但並不能從本質上消除這個弊端。

2.NIO:在JDK1.4以前,Java的IO模型一直是BIO,但從JDK1.4開始,JDK引入的新的IO模型NIO,它是同步非阻塞的。而伺服器的實現模式是多個請求一個執行緒,即請求會註冊到多路複用器Selector上,多路複用器輪詢到連線有IO請求時才啟動一個執行緒處理。

3.AIO:JDK1.7釋出了NIO2.0,這就是真正意義上的非同步非阻塞,伺服器的實現模式為多個有效請求一個執行緒,客戶端的IO請求都是由OS先完成再通知伺服器應用去啟動執行緒處理(回撥)。

應用場景:併發連線數不多時採用BIO,因為它程式設計和除錯都非常簡單,但如果涉及到高併發的情況,應選擇NIO或AIO,更好的建議是採用成熟的網路通訊框架Netty。