同步與異步
的概念, 關注的是 消息通訊機制數組
同步
是指發出一個請求, 在沒有獲得結果以前該請求就不返回結果, 請求返回時, 也就獲得結果了.好比洗衣服, 把衣服放在洗衣機裏, 沒有洗好以前咱們一直看着, 直到洗好了纔拿出來晾曬.網絡
異步
是指發出一個請求後, 馬上獲得了迴應, 但沒有返回結果. 這時咱們能夠再處理別的事情(發送其餘請求), 因此這種方式須要咱們經過狀態主動查看是否有告終果, 或者能夠設置一個回調來通知調用者.好比洗衣服時, 把衣服放到洗衣機裏, 咱們就能夠去作別的事情, 過會兒來看看有沒有洗好(經過狀態查詢);
或者咱們設置洗衣機洗完後響鈴來通知咱們洗好了(回調通知)異步
阻塞與非阻塞
很容易和同步與異步
混淆, 但二者關注點是不同的. 阻塞與非阻塞
關注的是 程序在等待調用結果時的狀態socket
阻塞
是指請求結果返回以前, 當前線程會被掛起(被阻塞), 這時線程什麼也作不了非阻塞
是指請求結果返回以前, 當前線程沒有被阻塞, 仍然能夠作其餘事情.阻塞
有個明顯的特徵就是線程一般是處於BLOCKED
狀態(BIO中的read()
操做時, 線程阻塞是JVM配合OS完成的, 此時Java獲取到線程的狀態還是RUNNABLE
但它確實已經被阻塞了)函數
若是要拿同步
來作比較的話, 同步通訊方式中的線程在發送請求以後等待結果這個過程當中應該處於RUNNABLE
狀態, 同步必須一步一步來完成, 就像是代碼必須執行完一行才能執行下一行, 因此必須等待這個請求返回以後纔可進行下一個請求, 即便等待結果的時間長, 也是在執行這個請求的過程當中. 而異步
則不用等上一條執行完, 能夠先執行別的代碼, 等請求有告終果再來獲取結果.操作系統
Java中的IO操做是JVM配合操做系統來完成的. 對於一個IO的讀操做, 數據會先被拷貝到操做系統內核的緩衝區中, 而後從操做系統內核的緩衝區拷貝到應用程序的地址空間. 因此整個過程可分爲兩個階段:線程
根據這兩個階段, 產生了常見的幾種不一樣的IO模型: BIO
, NIO
, IO多路複用
和AIO
.code
BIO
即Blocking I/O
(阻塞 I/O), BIO整個過程以下圖:接口
程序發送請求給內核, 而後由內核去進行通訊, 在內核準備好數據以前這個線程是被掛起的, 因此在兩個階段程序都處於掛起狀態.進程
NIO
即Non-Blocking I/O
(非阻塞 I/O), NIO整個過程以下圖:
與BIO的明顯區別是, 發起第一次請求後, 線程並無被阻塞, 它反覆檢查數據是否準備好, 把原來大塊不能用的阻塞時間分紅了許多」小阻塞」(檢查), 因此進程不斷有機會被執行. 這個檢查有沒有準備好數據的過程有點相似於」輪詢」.
IO多路複用(I/O Multiplexing
)有select
, poll
, epoll
等不一樣方式, 它的優勢在於單個線程能夠同時處理多個網絡IO.
NIO
中輪詢操做是用戶線程進行的, 若是把這個任務交給其餘線程, 則用戶線程就不用這麼費勁的查詢狀態了. IO多路複用
調用系統級別的select
或poll
模型, 由系統進行監控IO狀態. select輪詢能夠監控許多socket的IO請求, 當有一個socket的數據準備好時就能夠返回.
多路複用IO過程圖:
用戶線程有一段時間是阻塞的, 從上圖來看, 與NIO
很像, 但與NIO不同的是, select不是等到全部數據準備好才返回, 而是隻要有一個準備好就返回, 它的優點在於能夠同時處理多個鏈接. 若鏈接不是不少的話, 它的效率不必定高, 可能還會更差.
Java 1.4
開始支持NIO(New IO)
, 就是採用了這種方式, 在套接字上提供selector
選擇機制, 當發起select()
時會阻塞等待至少一個事件返回.
AIO
即Asynchronous I/O
(異步 I/O), 這是Java 1.7
引入的NIO 2.0
中用到的. 整個過程當中, 用戶線程發起一個系統調用以後無須等待, 能夠處理別的事情. 由操做系統等待接收內容, 接收後把數據拷貝到用戶進程中, 最後通知用戶程序已經可使用數據了, 兩個階段都是非阻塞的. AIO整個過程以下圖:
AIO
屬於異步模型, 用戶線程能夠同時處理別的事情, 咱們怎麼進一步加工處理結果呢? Java在這個模型中提供了兩種方法:
CompletionHandler
接口, 在調用時把回調函數傳遞給對應的API便可Future
. 處理完別的事情, 能夠經過isDone()
可查看是否已經準備好數據, 經過get()
方法等待返回數據.上面這幾種模式, BIO
整個過程都等待返回, NIO
和IO多路複用
在第二個階段等待返回, 所以從整個過程來看, 這三個模式都屬於同步方式. AIO
在整個過程當中沒有等待返回, 屬於異步方式.