引言
在進行I/O學習的時候,阻塞和非阻塞,同步和異步這幾個概念常常被提及,但是很多人對這幾個概念一直很模糊。要想學好Netty,這幾個概念必須要掌握清楚。
同步和異步
同步與異步的區別在於,異步基於通知,當程序執行完畢后后,會有一個通知的機制來告知你程序執行完畢;而同步則沒有,只能通過自己調用API去查詢程序是否已經執行完畢。
阻塞與非阻塞
阻塞與非阻塞的卻別在於,阻塞不能執行其他代碼,必須等待結果返回。而非阻塞則表示在等待執行結果返回的過程中可以去做別的事情。
舉例
同步阻塞:隔壁老王買了一個電飯煲,然后老王開始煮飯,煮飯的過程中一直守着電飯煲什么事情都不干。蠢!
同步非阻塞:老王第二天開始煮飯,煮飯的時候學聰明了,老王跑去客廳看電視了,然后每隔10分鍾來看看飯做好沒有。恩恩,聰明了許多。
異步阻塞:老王發現做飯怎么這么麻煩呀,於是跑去商場買了一個帶通知的電飯煲,當飯煮好以后,電飯煲會播放音樂。老王用新買的電飯煲開始做飯,煮飯的過程中一直守着電飯煲什么事情都不干。蠢到極致!!
異步非阻塞:老王第二天也用新買的電飯煲做飯,這次學聰明了,跑去客廳看電視,然后飯做好了,開始播放音樂。老王這時跑到廚房美滋滋的開始吃起了飯。嗯,完美!
異步就一定比同步快嗎?
不一定!在打多時候異步並不比同步快。從本質上來講,異步只是解決並發的效率問題,如果只有一個程序在運行,異步的執行速度可能還會稍慢於同步,因為還維護了一個通知機制。
根據需求來決定是使用同步還是使用異步。
同步的好處:
1、同步流程對結果處理通常更為簡單,可以就近處理。
2、同步流程對結果的處理始終和前文保持在一個上下文內。
3、同步流程可以很容易捕獲、處理異常。
4、同步流程是最天然的控制過程順序執行的方式。
異步的好處:
1、異步流程可以立即給調用方返回初步的結果。
2、異步流程可以延遲給調用方最終的結果數據,在此期間可以做更多額外的工作,例如結果記錄等等。
3、異步流程在執行的過程中,可以釋放占用的線程等資源,避免阻塞,等到結果產生再重新獲取線程處理。
4、異步流程可以等多次調用的結果出來后,再統一返回一次結果集合,提高響應效率。
非阻塞就一定比阻塞好嗎?
不一定! 如果所需要執行的任務時間片很短,那么非阻塞的方式由於會經常進行上線文切換,切換上下文所需的代價可能會讓程序執行效率大大下降,得不償失。
總結
關於同步/異步,阻塞/非阻塞。使用都是根據場景來決定的,並不能一味地說誰比誰有優勢,誰比誰好。存在就有他存在的價值。希望大家能徹底理解這幾個概念,對今后的學習有很大的幫助。