BIO,NIO,AIO的區別與選擇

       Java 中的 BIO、NIO和 AIO 理解爲是 Java 語言對操作系統的各種 IO 模型的封裝。程序員在使用這些 API 的時候,不需要關心操作系統層面的知識,也不需要根據不同操作系統編寫不同的代碼。只需要使用Java的API就可以了。

       在講 BIO,NIO,AIO 之前先來回顧一下這樣幾個概念:同步與異步,阻塞與非阻塞。

同步與異步

  • 同步: 同步就是發起一個調用後,被調用者未處理完請求之前,調用不返回。

  • 異步: 異步就是發起一個調用後,立刻得到被調用者的迴應表示已接收到請求,但是被調用者並沒有返回結果,此時我們可以處理其他的請求,被調用者通常依靠事件,回調等機制來通知調用者其返回結果。

       同步和異步的區別最大在於異步的話調用者不需要等待處理結果,被調用者會通過回調等機制來通知調用者其返回結果。

阻塞和非阻塞

  • 阻塞: 阻塞就是發起一個請求,調用者一直等待請求結果返回,也就是當前線程會被掛起,無法從事其他任務,只有當條件就緒才能繼續。

  • 非阻塞: 非阻塞就是發起一個請求,調用者不用一直等着結果返回,可以先去幹其他事情。

   那麼同步阻塞、同步非阻塞和異步非阻塞又代表什麼意思呢?

       舉個生活中簡單的例子,你媽媽讓你燒水,小時候你比較笨啊,在哪裏傻等着水開(同步阻塞)。等你稍微再長大一點,你知道每次燒水的空隙可以去幹點其他事,然後只需要時不時來看看水開了沒有(同步非阻塞)。後來,你們家用上了水開了會發出聲音的壺,這樣你就只需要聽到響聲後就知道水開了,在這期間你可以隨便幹自己的事情,你需要去倒水了(異步非阻塞)。

BIO,NIO,AIO的區別

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。

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