Netty基礎系列(2) --完全理解阻塞非阻塞與同步異步的區別

引言

在進行I/O學習的時候,阻塞和非阻塞,同步和異步這幾個概念經常被說起,可是不少人對這幾個概念一直很模糊。要想學好Netty,這幾個概念必需要掌握清楚。併發

同步和異步

同步與異步的區別在於,異步基於通知,當程序執行完畢後後,會有一個通知的機制來告知你程序執行完畢;而同步則沒有,只能經過本身調用API去查詢程序是否已經執行完畢。異步

阻塞與非阻塞

阻塞與非阻塞的卻別在於,阻塞不能執行其餘代碼,必須等待結果返回。而非阻塞則表示在等待執行結果返回的過程當中能夠去作別的事情。學習

舉例

同步阻塞:隔壁老王買了一個電飯煲,而後老王開始煮飯,煮飯的過程當中一直守着電飯煲什麼事情都不幹。蠢!線程

同步非阻塞:老王次日開始煮飯,煮飯的時候學聰明瞭,老王跑去客廳看電視了,而後每隔10分鐘來看看飯作好沒有。恩恩,聰明瞭許多。資源

異步阻塞:老王發現作飯怎麼這麼麻煩呀,因而跑去商場買了一個帶通知的電飯煲,當飯煮好之後,電飯煲會播放音樂。老王用新買的電飯煲開始作飯,煮飯的過程當中一直守着電飯煲什麼事情都不幹。蠢到極致!!同步

異步非阻塞:老王次日也用新買的電飯煲作飯,此次學聰明瞭,跑去客廳看電視,而後飯作好了,開始播放音樂。老王這時跑到廚房美滋滋的開始吃起了飯。嗯,完美!效率

異步就必定比同步快嗎?

不必定!在打多時候異步並不比同步快。從本質上來說,異步只是解決併發的效率問題,若是隻有一個程序在運行,異步的執行速度可能還會稍慢於同步,由於還維護了一個通知機制。程序

根據需求來決定是使用同步仍是使用異步。總結

同步的好處:數據

一、同步流程對結果處理一般更爲簡單,能夠就近處理。

二、同步流程對結果的處理始終和前文保持在一個上下文內。

三、同步流程能夠很容易捕獲、處理異常。

四、同步流程是最自然的控制過程順序執行的方式。

異步的好處:

一、異步流程能夠當即給調用方返回初步的結果。

二、異步流程能夠延遲給調用方最終的結果數據,在此期間能夠作更多額外的工做,例如結果記錄等等。

三、異步流程在執行的過程當中,能夠釋放佔用的線程等資源,避免阻塞,等到結果產生再從新獲取線程處理。

四、異步流程能夠等屢次調用的結果出來後,再統一返回一次結果集合,提升響應效率。

非阻塞就必定比阻塞好嗎?

不必定! 若是所須要執行的任務時間片很短,那麼非阻塞的方式因爲會常常進行上線文切換,切換上下文所需的代價可能會讓程序執行效率大大降低,得不償失。

總結

關於同步/異步,阻塞/非阻塞。使用都是根據場景來決定的,並不能一味地說誰比誰有優點,誰比誰好。存在就有他存在的價值。但願你們能完全理解這幾個概念,對從此的學習有很大的幫助。

相關文章
相關標籤/搜索