理解 JAVA BIO與NIO、AIO

IO的方式通常分爲幾種,同步阻塞的BIO、同步非阻塞的NIO、異步非阻塞的AIO。
看起來比較難理解, 首先我們看一下 什麼是同步,異步,阻塞,非阻塞

就舉個栗子,以銀行取款爲例:

  • 同步 : 自己親自出馬持銀行卡到銀行取錢(使用同步IO時,Java自己處理IO讀寫);

  • 異步 : 委託一小弟拿銀行卡到銀行取錢,然後給你(使用異步IO時,Java將IO讀寫委託給OS處理,需要將數據緩衝區地址和大小傳給OS(銀行卡和密碼),OS需要支持異步IO操作API);

  • 阻塞 : ATM排隊取款,你只能等待(使用阻塞IO時,Java調用會一直阻塞到讀寫完成才返回);

  • 非阻塞 : 櫃檯取款,取個號,然後坐在椅子上做其它事,等號廣播會通知你辦理,沒到號你就不能去,你可以不斷問大堂經理排到了沒有,大堂經理如果說還沒到你就不能去(使用非阻塞IO時,如果不能讀寫Java調用會馬上返回,當IO事件分發器會通知可讀寫時再繼續進行讀寫,不斷循環直到讀寫完成)

結合上面我們再來看下什麼是 IO與NIO、AIO

  • 同步阻塞I/O(BIO)

同步阻塞I/O,服務器實現模式爲一個連接一個線程,即客戶端有連接請求時服務器就需要啓動一個線程進行處理,如果這個連接不做任何事情會造成不必要的線程開銷,可以通過線程池機制來改善。BIO方式適用於連接數目比較小且固定的架構,這種方式對服務端資源要求比較高,併發侷限於應用中,在jdk1.4以前是唯一的io現在,但程序直觀簡單易理解

  • 同步非阻塞I/O(NIO):

同步非阻塞I/O,服務器實現模式爲一個請求一個線程,即客戶端發送的連接請求都會註冊到多路複用器上,多路複用器輪詢到連接有IO請求時才啓動一個線程進行處理。NIO方式適用於連接數目多且連接比較短(輕操作)的架構,比如聊天服務器,併發侷限於應用中,編程比較複雜,jdk1,4開始支持

  • 異步非阻塞I/O(AIO):

異步非阻塞I/O,服務器實現模式爲一個有效請求一個線程,客戶端的IO請求都是由操作系統先完成了再通知服務器用其啓動線程進行處理。AIO方式適用於連接數目多且連接比較長(重操作)的架構,比如相冊服務器,充分調用OS參與併發操作,編程比較複雜,jdk1.7開始支持。

下面我們來看下 他們的區別
IO與NIO區別:

IO面向流,NIO面向緩衝區

IO的各種流是阻塞的,NIO是非阻塞模式
用個圖片描述一下更加直接:
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章