1. 程式人生 > >同步,非同步,阻塞,非阻塞,BIO,AIO,NIO 理解

同步,非同步,阻塞,非阻塞,BIO,AIO,NIO 理解

對於同步,非同步,阻塞,非阻塞的理解可以看一個例子:

以銀行取款為例:
同    步 : 自己親自出馬持銀行卡到銀行取錢(使用同步IO時,Java自己處理IO讀寫)。
異    步 : 委託一小弟拿銀行卡到銀行取錢,然後給你(使用非同步IO時,Java將IO讀寫委託給OS處理,需要將資料緩衝區地址和大小傳給OS(銀行卡和密碼),

                  OS需要支援非同步IO操作API)。
阻    塞 : ATM排隊取款,你只能等待(使用阻塞IO時,Java呼叫會一直阻塞到讀寫完成才返回)。
非阻塞 : 櫃檯取款,取個號,然後坐在椅子上做其它事,等號廣播會通知你辦理,沒到號你就不能去,你可以不斷問大堂經理排到了沒有,大堂經理如果

                  說還沒到你就不能去(使用非阻塞IO時,如果不能讀寫Java呼叫會馬上返回,當IO事件分發器會通知可讀寫時再繼續進行讀寫,不斷迴圈直到讀寫完成)。

對於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屬於底層操作,需要作業系統支援,併發也需要作業系統的支援,所以效能方面不同作業系統差異會比較明顯。