天天看點

NIO2 AIOjava對BIO,NIO,AIO的支援同步和異步阻塞和非阻塞使用場景

與NIO不同,在進行讀寫操作時,隻需直接調用API的read()或write方法即可。這兩個方法都是異步的。對于讀操作而言,當有流可讀取時,作業系統會将流中的資料傳入read方法的緩沖區,并通知應用程式;對應寫操作而言,當作業系統将流寫入完畢時,會主動通知應用程式。可以認為:read/write方法都是異步的,完成後會主動調用回調函數。

在JDK1.7中,AIO被稱為NIO.2,主要在java.nio.channels包下增加了四個異步通道:

  • AsynchronousServerSocketChannel
  • AsynchronousSocketChannel
  • AsynchronousDatagramChannel
  • AsynchronousFileChannel

    其中的read/write方法,會注冊一個帶回調函數對象,當執行完讀寫操作時,會直接調用回調函數。

  • BIO是一個連接配接一個線程
  • NIO是一個請求一個線程
  • AIO是一個有效請求一個線程

java對BIO,NIO,AIO的支援

  • BIO:同步阻塞的,伺服器實作模式為一個連接配接一個線程,即用戶端有連接配接請求時服務端就會啟動一個線程進行處理,如果這個連接配接不做任何事情就會造成不必要的線程開銷,可以通過線程池機制改善。
  • NIO:同步非阻塞的,伺服器實作模式為一個請求一個線程,即用戶端發送的連接配接請求都會注冊到多路複用器上,多路複用器輪詢到連接配接有IO請求時會啟動一個線程進行處理。
  • AIO:異步非阻塞,伺服器實作模式為一個有效請求一個線程,用戶端的IO請求都是系統完成後主動通知伺服器去啟動線程進行處理。

    IO屬于底層操作,需要作業系統支援,并發也需要作業系統支援,不同的作業系統性能方面會有差異。

同步和異步

同步和異步是針對應用程式和核心的互動而言的。同步指的是應用程式觸發IO操作并等待或輪詢的去檢視IO操作是否就緒,異步指應用程式觸發IO操作後便開始做自己的事情,當IO操作完成時會得到IO完成的通知。

阻塞和非阻塞

阻塞和非阻塞式針對程序通路資料的時候,根據IO操作的就緒狀态來采用不同的實作方式,阻塞方式下讀取或寫入操作将一直等待,非阻塞,在讀取或寫入後會立即傳回一個狀态值。

使用場景

  • BIO:BIO方式适用于連接配接數目比較小且固定的架構,這種方式對伺服器資源要求比較高,并發局限于應用中,JDK1.4以前的唯一選擇,但程式直覺簡單易了解。
  • NIO:适用于連接配接數目多且連接配接比較短(輕操作的架構),比如聊天伺服器,并發局限于應用中,程式設計比較複雜,JDK1.4開始支援。
  • AIO:AIO方式使用于連接配接數目多且連接配接比較長(重操作)的架構,比如相冊伺服器,充分調用OS參與并發操作,程式設計比較複雜,JDK7開始支援。