一篇文章理解 同步異步、阻塞非阻塞

前述

同步異步,阻塞非阻塞是一些非常常見的概念,但是對於開發者來說往往是用到了很難說清楚。
筆者專門整理了下這方面的概念,作此文以記之。

這部分內容可能存在一些爭議,如有不同意見歡迎評論交流。

概念

個人理解同步異步與阻塞非阻塞最好的區分是從描述對象上:

  • 同步異步:用於描述任務、事件或者行爲。
  • 阻塞非阻塞:用於描述線程或者進程是否會被掛起。

同步

一個任務調起另一個任務的時候,會去等待其任務返回結果(或執行結束),然後再繼續執行。

如下兩圖都是同步操作:
在Task A調用Task B後,Task A會等待Task B執行結束後,再繼續執行。
在這裏插入圖片描述
在這裏插入圖片描述

異步

一個任務調起另一個任務的時候,不會去等待其返回結果(或執行結束),仍然繼續執行自己的邏輯。
如下圖,在Task A調用Task B後,Task A不會停止執行,Task A與Task B並行執行。
在這裏插入圖片描述

阻塞

是指調用結果返回之前,當前線程(進程)會被掛起。
在調用的結果返回之前,當前線程(進程)不會執行其他操作。
如下圖:
在這裏插入圖片描述

非阻塞

指執行一個調用,當前線程(進程)不會掛起。
當前線程(進程)如果還有其他操作,不會影響執行。
如下圖:
在這裏插入圖片描述

例子

同步異步與阻塞非阻塞,不是非此即彼的概念。
讀者肯定可以發現上面的概念中,兩者的例圖都已經有了重複的情況。
後面的篇幅就展示四個例子,便於讀者用作區分:

  1. 同步阻塞
  2. 同步非阻塞
  3. 異步非阻塞

“異步阻塞”筆者沒有想到相關的場景,如有讀者有相關見解的歡迎評論溝通。
個人理解,異步行爲下,Task是不會去等待其他Task的結果的,那麼阻塞就沒有意義,因此這種場景非常少見。
(如果同時存在2個以上的Task,“異步非阻塞”和“同步阻塞”並存的場景還是有的,但是這也不能稱爲“異步阻塞”。)

同步阻塞

TASK A 等待Task B執行結束後才繼續執行,因此是一個同步操作。
TASK A 在Thread One中調用Task B的時候,Thread One掛起等待Task B的返回結果,因此是阻塞。
在這裏插入圖片描述

同步非阻塞

TASK A 等待Task B執行結束後才繼續執行,因此是一個同步操作。
TASK A 和Task B在同一個線程,沒有存在掛起線程的情況,因此是非阻塞。
在這裏插入圖片描述

異步非阻塞

TASK A在執行過程中調起了Task B,與Task B並行執行,因此是異步。
Task A調起Task B後,並沒有掛起當前線程,因此是非阻塞。
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章