週末在家加班,正在瘋狂的擼代碼,女友很開心的跑過來,手裏拿着他剛剛畫好的一副漫畫。
markdown
同步、異步、阻塞、非阻塞都是和IO(輸入輸出)有關的概念。最簡單的文件讀取就是IO操做。而在文件讀取這件事兒上,能夠有多種方式。
異步
說到燒水,咱們都是經過熱水壺來燒水的。在好久以前,科技尚未這麼發達的時候,若是咱們要燒水,須要把水壺放到火爐上,咱們經過觀察水壺內的水的沸騰程度來判斷水有沒有燒開。spa
隨着科技的發展,如今市面上的水壺都有了提醒功能,當咱們把水壺插電以後,水壺水燒開以後會經過聲音提醒咱們水開了。線程
對於燒水這件事兒來講,傳統水壺的燒水就是同步的,高科技水壺的燒水就是異步的。3d
同步請求,A調用B,B的處理是同步的,在處理完以前他不會通知A,只有處理完以後纔會明確的通知A。code
異步請求,A調用B,B的處理是異步的,B在接到請求後先告訴A我已經接到請求了,而後異步去處理,處理完以後經過回調等方式再通知A。orm
因此說,同步和異步最大的區別就是被調用方的執行方式和返回時機。同步指的是被調用方作完事情以後再返回,異步指的是被調用方先返回,而後再作事情,作完以後再想辦法通知調用方。對象
仍是那個燒水的例子,當你把水放到水壺裏面,按下開關後,你能夠坐在水壺前面,別的事情什麼都不作,一直等着水燒好。你還能夠先去客廳看電視,等着水開就行了。同步
對於你來講,坐在水壺前面等就是阻塞的,去客廳看電視等着水開就是非阻塞的。it
阻塞請求,A調用B,A一直等着B的返回,別的事情什麼也不幹。
非阻塞請求,A調用B,A不用一直等着B的返回,先去忙別的事情了。
因此說,阻塞和非阻塞最大的區別就是在被調用方返回結果以前的這段時間內,調用方是否一直等待。阻塞指的是調用方一直等待別的事情什麼都不作。非阻塞指的是調用方先去忙別的事情。
首先,前面已經提到過,阻塞、非阻塞和同步、異步其實針對的對象是不同的。阻塞、非阻塞說的是調用者,同步、異步說的是被調用者。
有人認爲阻塞和同步是一回事兒,非阻塞和異步是一回事。可是這是不對的。
先來看同步場景中是如何包含阻塞和非阻塞狀況的。
咱們是用傳統的水壺燒水。在水燒開以前咱們一直作在水壺前面,等着水開。這就是阻塞的。
咱們是用傳統的水壺燒水。在水燒開以前咱們先去客廳看電視了,可是水壺不會主動通知咱們,須要咱們時不時的去廚房看一下水有沒有燒開。這就是非阻塞的。
再來看異步場景中是如何包含阻塞和非阻塞狀況的。
咱們是用帶有提醒功能的水壺燒水。在水燒發出提醒以前咱們一直作在水壺前面,等着水開。這就是阻塞的。
咱們是用帶有提醒功能的水壺燒水。在水燒發出提醒以前咱們先去客廳看電視了,等水壺發出聲音提醒咱們。這就是非阻塞的。
在Java語言中,一共提供了三種IO模型,分別是阻塞IO(BIO)、非阻塞IO(NIO)、異步IO(AIO)。
這裏面的BIO和NIO都是同步的IO模型,即同步阻塞IO和同步非阻塞IO,異步IO指的是異步非阻塞IO。
BIO (Blocking I/O):同步阻塞I/O模式,數據的讀取寫入必須阻塞在一個線程內等待其完成。
NIO (New I/O):同時支持阻塞與非阻塞模式,但主要是使用同步非阻塞IO。
AIO (Asynchronous I/O):異步非阻塞I/O模型。
BIO (Blocking I/O):有一排水壺在燒開水,BIO的工做模式就是,叫一個線程停留在一個水壺那,直到這個水壺燒開,纔去處理下一個水壺。可是實際上線程在等待水壺燒開的時間段什麼都沒有作。
NIO (New I/O):NIO的作法是叫一個線程不斷的輪詢每一個水壺的狀態,看看是否有水壺的狀態發生了改變,從而進行下一步的操做。
AIO ( Asynchronous I/O):爲每一個水壺上面裝了一個開關,水燒開以後,水壺會自動通知我水燒開了。
滴滴滴滴,這時候水壺響了,打斷了女友的發問。女友去拿來燒好的熱水,給我泡了一杯咖啡。