一、同步異步、阻塞非阻塞概念
同步和異步是針對應用程序和內核的交互而言的。 阻塞和非阻塞是針對於進程在訪問數據的時候,根據IO操做的就緒狀態來採起的不一樣方式,說白了是一種讀取或者寫入操做函數的實現方式,阻塞方式下讀取或者寫入函數將一直等待,而非阻塞方式下,讀取或者寫入函數會當即返回一個狀態值。編程
由上描述基本能夠總結一句簡短的話,同步和異步是目的,阻塞和非阻塞是實現方式。服務器
1 同步 指的是用戶進程觸發IO操做並等待或者輪詢的去查看IO操做是否就緒 本身上街買衣服,本身親自幹這件事,別的事幹不了。架構
2 異步 異步是指用戶進程觸發IO操做之後便開始作本身的事情,而當IO操做已經完成的時候會獲得IO完成的通知(異步的特色就是通知) 告訴朋友本身合適衣服的尺寸,大小,顏色,讓朋友委託去賣,而後本身能夠去幹別的事。(使用異步IO時,Java將IO讀寫委託給OS處理,須要將數據緩衝區地址和大小傳給OS)併發
3 阻塞 所謂阻塞方式的意思是指, 當試圖對該文件描述符進行讀寫時, 若是當時沒有東西可讀,或者暫時不可寫, 程序就進入等待 狀態, 直到有東西可讀或者可寫爲止 去公交站充值,發現這個時候,充值員不在(可能上廁所去了),而後咱們就在這裏等待,一直等到充值員回來爲止。(固然現實社會,可不是這樣,可是在計算機裏確實如此。)異步
4 非阻塞 非阻塞狀態下, 若是沒有東西可讀, 或者不可寫, 讀寫函數立刻返回, 而不會等待, 銀行裏取款辦業務時,領取一張小票,領取完後咱們本身能夠玩玩手機,或者與別人聊聊天,當輪咱們時,銀行的喇叭會通知,這時候咱們就能夠去了。函數
二、Java對BIO、NIO、AIO的支持:性能
Java BIO : 同步並阻塞,服務器實現模式爲一個鏈接一個線程,即客戶端有鏈接請求時服務器端就須要啓動一個線程進行處理,若是這個鏈接不作任何事情會形成沒必要要的線程開銷,固然能夠經過線程池機制改善。操作系統
Java NIO : 同步非阻塞,服務器實現模式爲一個請求一個線程,即客戶端發送的鏈接請求都會註冊到多路複用器上,多路複用器輪詢到鏈接有I/O請求時才啓動一個線程進行處理。線程
Java AIO(NIO.2) : 異步非阻塞,服務器實現模式爲一個有效請求一個線程,客戶端的I/O請求都是由OS先完成了再通知服務器應用去啓動線程進行處理,進程
三、BIO、NIO、AIO適用場景分析:
BIO方式適用於鏈接數目比較小且固定的架構,這種方式對服務器資源要求比較高,併發侷限於應用中,JDK1.4之前的惟一選擇,但程序直觀簡單易理解。
NIO方式適用於鏈接數目多且鏈接比較短(輕操做)的架構,好比聊天服務器,併發侷限於應用中,編程比較複雜,JDK1.4開始支持。
AIO方式使用於鏈接數目多且鏈接比較長(重操做)的架構,好比相冊服務器,充分調用OS參與併發操做,編程比較複雜,JDK7開始支持。
另外,I/O屬於底層操做,須要操做系統支持,併發也須要操做系統的支持,因此性能方面不一樣操做系統差別會比較明顯。