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


引言

在進行I/O學習的時候,阻塞和非阻塞,同步和異步這幾個概念常常被提及,但是很多人對這幾個概念一直很模糊。要想學好Netty,這幾個概念必須要掌握清楚。

同步和異步

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

阻塞與非阻塞

阻塞與非阻塞的卻別在於,阻塞不能執行其他代碼,必須等待結果返回。而非阻塞則表示在等待執行結果返回的過程中可以去做別的事情。

舉例

同步阻塞:隔壁老王買了一個電飯煲,然后老王開始煮飯,煮飯的過程中一直守着電飯煲什么事情都不干。蠢!

同步非阻塞:老王第二天開始煮飯,煮飯的時候學聰明了,老王跑去客廳看電視了,然后每隔10分鍾來看看飯做好沒有。恩恩,聰明了許多。

異步阻塞:老王發現做飯怎么這么麻煩呀,於是跑去商場買了一個帶通知的電飯煲,當飯煮好以后,電飯煲會播放音樂。老王用新買的電飯煲開始做飯,煮飯的過程中一直守着電飯煲什么事情都不干。蠢到極致!!

異步非阻塞:老王第二天也用新買的電飯煲做飯,這次學聰明了,跑去客廳看電視,然后飯做好了,開始播放音樂。老王這時跑到廚房美滋滋的開始吃起了飯。嗯,完美!

異步就一定比同步快嗎?

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

根據需求來決定是使用同步還是使用異步。

同步的好處:

1、同步流程對結果處理通常更為簡單,可以就近處理。

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

3、同步流程可以很容易捕獲、處理異常。

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

異步的好處:

1、異步流程可以立即給調用方返回初步的結果。

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

3、異步流程在執行的過程中,可以釋放占用的線程等資源,避免阻塞,等到結果產生再重新獲取線程處理。

4、異步流程可以等多次調用的結果出來后,再統一返回一次結果集合,提高響應效率。

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

不一定! 如果所需要執行的任務時間片很短,那么非阻塞的方式由於會經常進行上線文切換,切換上下文所需的代價可能會讓程序執行效率大大下降,得不償失。

總結

關於同步/異步,阻塞/非阻塞。使用都是根據場景來決定的,並不能一味地說誰比誰有優勢,誰比誰好。存在就有他存在的價值。希望大家能徹底理解這幾個概念,對今后的學習有很大的幫助。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM