超雞容易理解的---同步異步,阻塞非阻塞

快來看超雞容易理解的同步異步,阻塞非阻塞,不再擔憂理解晦澀的語言了。異步

阻塞和非阻塞指的是執行一個操做是等操做結束再返回,仍是立刻返回。spa

好比餐館的服務員爲用戶點菜,當有用戶點完菜後,服務員將菜單給後臺廚師,此時有兩種方式:線程

  • 第一種:就在出菜窗口等待,直到廚師炒完菜後將菜送到窗口,而後服務員再將菜送到用戶手中;
  • 第二種:等一會再到窗口來問廚師,某個菜好了沒?若是沒有先處理其餘事情,等會再去問一次;

第一種就是阻塞方式,第二種則是非阻塞的。事件

  同步和異步又是另一個概念,它是事件自己的一個屬性。還拿前面點菜爲例,服務員直接跟廚師打交道,菜出來沒出來,服務員直接指導,但只有當廚師將菜送到服務員手上,這個過程纔算正常完成,這就是同步的事件。一樣是點菜,有些餐館有專門的傳菜人員,當廚師炒好菜後,傳菜員將菜送到傳菜窗口,並通知服務員,這就變成異步的了。其實異步還能夠分爲兩種:帶通知的和不帶通知的。前面說的那種屬於帶通知的。有些傳菜員幹活可能主動性不是很夠,不會主動通知你,你就須要時不時的去關注一下狀態。這種就是不帶通知的異步。同步

對於同步的事件,你只能以阻塞的方式去作。而對於異步的事件,阻塞和非阻塞都是能夠的。非阻塞又有兩種方式:主動查詢和被動接收消息。被動不意味着必定很差,在這裏它偏偏是效率更高的,由於在主動查詢裏絕大部分的查詢是在作無用功。對於帶通知的異步事件,二者皆可。而對於不帶通知的,則只能用主動查詢。class

  可是對於非阻塞和異步的概念有點混淆,非阻塞只是意味着方法調用不阻塞,就是說做爲服務員的你不用一直在窗口等,非阻塞的邏輯是"等能夠讀(寫)了告訴你",可是完成讀(寫)工做的仍是調用者(線程)服務員的你等菜到窗口了仍是要你親自去拿。而異步意味這你能夠不用親自去作讀(寫)這件事,你的工做讓別人(別的線程)來作,你只須要發起調用,別人把工做作完之後,或許再通知你,它的邏輯是我作完了 告訴/不告訴 你,他和非阻塞的區別在於一個是"已經作完"另外一個是"能夠去作"效率

這也是NIOAIO最大的區別,就是NIO在有通知時能夠進行相關操做,而AIO有通知時則表明操做已經完成後臺

再舉一個例子:方法

  去書店借一本書,同步就是我要親自到書店,問老闆有沒有這本書,阻塞就是老闆查詢的時候(讀寫)我只能在那等着,老闆找到書後把書交給我,這就是同步阻塞。數據

  我親自到書店借書,老闆在找這本書的時候,我能夠去幹別的,而後每隔一段時間去問老闆書找到了沒有,也能夠等老闆找到書之後通知我,這就是同步非阻塞。

  我想借本書,找我的幫我去借,借到書之後再通知我,這就是異步,我只發起調用,可是自己並不參與這個事件,而是讓別的線程去作這個事。

  同步與異步是對應的,它們是線程之間的關係,兩個線程之間要麼是同步的,要麼是異步的。

  阻塞與非阻塞是對同一個線程來講的,在某個時刻,線程要麼處於阻塞,要麼處於非阻塞。

  幫我借書的那我的有沒有借到書,我能夠打電話問他(輪詢),也能夠等他通知我,這是異步的通知;在借書的過程當中借書的那我的能夠輪詢的方式查看書是否已經找到(緩衝區有沒有數據),找到了你能夠把它拿走,也能夠等老闆找到書後通知我,這是非阻塞的通知與輪詢。

相關文章
相關標籤/搜索