聊一聊BIO、NIO

1、標準I/O

InputStream和OutputStream作用于字節(jié)流,Reader和Writer作用于字符流。

JDK1.4引入新的I/O類庫,舊的I/O包已經(jīng)使用nio重新實現(xiàn)過,以便充分利用這種速度提高。

通道和緩存。我們可以把它相像成一個煤礦,通道是一個包含煤礦(數(shù)據(jù))的礦藏,而緩沖器則是派送到礦藏的卡車。也就是說,我們并不是直接和通道交互,而只與緩沖交互,并把緩沖派到通道,獲取數(shù)據(jù)或發(fā)送數(shù)據(jù)。

不使用緩沖


使用緩沖

2、BIO

bio即block-I/O,同步阻塞式I/O

由代碼可知,在while循環(huán)內(nèi)服務端會調(diào)用accept方法等待接收客戶端的連接請求,一旦一個請求連接,就可以建立通信套接字在這個通信套接字上進行讀寫操作,此時不能再接收其他客戶端連接請求,只能等待同當前連接的客戶端的操作執(zhí)行完成,再進行下一次循環(huán)。此處可以使用線程池技術(shù),提高并發(fā),但隨著連接的增多,將會消耗過多的內(nèi)存資源,導致服務器變慢甚至崩潰。

3、NIO

nio即no-block I/O,同步非阻塞式IO

init操作是獲取一個serverSocketChanel并注冊到selector

run方法實際是對selector做遍歷,監(jiān)聽事件(SelectionKey 有isReadable()、isWritable()、isConnectable()、isAcceptable())并處理。利用buffer作為程序與I/O的緩沖提高運行速度。

NIO較BIO的優(yōu)勢,通過selector輪詢channel,選擇就緒事件處理。當存在大量客戶端連接請求時,服務器處理事件可以得到有效調(diào)控。

①客戶端發(fā)起的連接請求是異步的,可以通過直接在多路復用器注冊O(shè)P_CONNECT操作等待后續(xù)操作,不需要同步阻塞等待結(jié)果可用。

②SocketChannel的讀寫都是異步的,如果沒有可讀寫的數(shù)據(jù)它不會同步等待,直接返回,這樣IO通信線程可以處理其他鏈路,不要同步等待這個鏈路可用。

③線程模型的優(yōu)化:由于JDK的Selector在Linux等主流OS中通過epoll實現(xiàn),沒有連接句柄數(shù)的限制,這意味著Selector線程可以同時處理成千上萬的客戶端連接,而且性能不會隨著客戶端的增加而線性下降,因此非常適合做高性能、高并發(fā)的網(wǎng)絡(luò)服務器。

陳釗對這個過程在java bio,nio,aio及源碼中講解得還是比較清晰的。


參考:

1、《Java編程思想》

2、Java中的BIO與NIO的區(qū)別詳解

3、java bio,nio,aio及源碼

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關(guān)閱讀更多精彩內(nèi)容

  • NIO(Non-blocking I/O,在Java領(lǐng)域,也稱為New I/O),是一種同步非阻塞的I/O模型,也...
    閃電是只貓閱讀 3,278評論 0 7
  • NIO(Non-blocking I/O,在Java領(lǐng)域,也稱為New I/O),是一種同步非阻塞的I/O模型,也...
    Demon_code閱讀 472評論 0 0
  • 1. 前言 有一些概念總是Java I/O一塊出現(xiàn),比如同步與異步,阻塞與非阻塞,這些概念往往也是非常難以區(qū)分。在...
    WekingZhang閱讀 595評論 0 2
  • 前言 只有光頭才能變強 回顧前面: 給女朋友講解什么是代理模式 包裝模式就是這么簡單啦 本來我預想是先來回顧一下傳...
    Java3y閱讀 7,728評論 5 291
  • 上午 訓練,下午又上課,中午被朋友拉去選壁紙,一直忙9點到家,洗完三套練功服,想起要先趕一篇領(lǐng)導講話,不敢懈怠...
    一粒珍珠閱讀 209評論 0 0

友情鏈接更多精彩內(nèi)容