Java NIO與Java BIO的區別

作者:Monica2333
鏈接:https://www.jianshu.com/p/8b3af5bf4ce1
來源:簡書

1.什麼是Java NIO?
同步非阻塞io模式,拿燒開水來說,NIO的做法是叫一個線程不斷的輪詢每個水壺的狀態,看看是否有水壺的狀態發生了改變,從而進行下一步的操作。
Java NIO有三大組成部分:Buffer,Channel,Selector,通過事件驅動模式實現了什麼時候有數據可讀的問題。
Channel:相當於IO操作的載體,相當於一個硬件設備,一個文件,一個socket或是區別程序中的不同IO操作,如read,write。
channel類似流,但又有些不同:
既可以從通道中讀取數據,又可以寫數據到通道。但流的讀寫通常是單向的。
通道可以異步地讀寫。
通道中的數據總是要先讀到一個Buffer,或者總是要從一個Buffer中寫入。

Buffer:用於和NIO通道進行交互。如你所知,數據是從通道讀入緩衝區,從緩衝區寫入到通道中的。
緩衝區本質上是一塊可以寫入數據,然後可以從中讀取數據的內存。這塊內存被包裝成NIO Buffer對象,並提供了一組方法,用來方便的訪問該塊內存。
channel 和 buffer 之間的交互如下:
在這裏插入圖片描述

Selector:Selector(選擇器)是Java NIO中能夠檢測一到多個NIO通道,通道將關心的事件註冊到selector 上,selector能夠知曉通道是否爲這些事件諸如讀寫事件做好數據準備。這樣,一個單獨的線程可以管理多個channel,從而管理多個網絡連接。

在這裏插入圖片描述
2.什麼是Java BIO?
同步阻塞IO模式,數據的讀取寫入必須阻塞在一個線程內等待其完成。這裏使用那個經典的燒開水例子,這裏假設一個燒開水的場景,有一排水壺在燒開水,BIO的工作模式就是, 叫一個線程停留在一個水壺那,直到這個水壺燒開,纔去處理下一個水壺。但是實際上線程在等待水壺燒開的時間段什麼都沒有做。不知道io操作中什麼時候有數據可讀,所以一直是阻塞的模式。
3.區別及應用
在這裏插入圖片描述
兩種模式的差異對比:
首先,線程是較爲重量級的資源。bio當併發量大,而後端服務或客戶端處理數據慢時就會產生產生大量線程處於等待中,即上述的阻塞,是非常嚴重的資源浪費。此外,線程的切換也會導致cpu資源的浪費,單機內存限制也無法過多的線程,只能單向以流的形式讀取數據。
在這裏插入圖片描述
nio使用單線程或者只使用少量的多線程,多個連接共用一個線程,消耗的線程資源會大幅減小。並且當處於等待(沒有事件)的時候線程資源可以釋放出來處理別的請求,通過事件驅動模型當有accept/read/write等事件發生後通知(喚醒)主線程分配資源來處理相關事件。以buffer緩衝區的形式處理數據,處理更爲方便。
在這裏插入圖片描述

發佈了40 篇原創文章 · 獲贊 22 · 訪問量 2萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章