前述
同步異步,阻塞非阻塞是一些非常常見的概念,但是對於開發者來說往往是用到了很難說清楚。
筆者專門整理了下這方面的概念,作此文以記之。
這部分內容可能存在一些爭議,如有不同意見歡迎評論交流。
概念
個人理解同步異步與阻塞非阻塞最好的區分是從描述對象上:
- 同步異步:用於描述任務、事件或者行爲。
- 阻塞非阻塞:用於描述線程或者進程是否會被掛起。
同步
一個任務調起另一個任務的時候,會去等待其任務返回結果(或執行結束),然後再繼續執行。
如下兩圖都是同步操作:
在Task A調用Task B後,Task A會等待Task B執行結束後,再繼續執行。
異步
一個任務調起另一個任務的時候,不會去等待其返回結果(或執行結束),仍然繼續執行自己的邏輯。
如下圖,在Task A調用Task B後,Task A不會停止執行,Task A與Task B並行執行。
阻塞
是指調用結果返回之前,當前線程(進程)會被掛起。
在調用的結果返回之前,當前線程(進程)不會執行其他操作。
如下圖:
非阻塞
指執行一個調用,當前線程(進程)不會掛起。
當前線程(進程)如果還有其他操作,不會影響執行。
如下圖:
例子
同步異步與阻塞非阻塞,不是非此即彼的概念。
讀者肯定可以發現上面的概念中,兩者的例圖都已經有了重複的情況。
後面的篇幅就展示四個例子,便於讀者用作區分:
- 同步阻塞
- 同步非阻塞
- 異步非阻塞
“異步阻塞”筆者沒有想到相關的場景,如有讀者有相關見解的歡迎評論溝通。
個人理解,異步行爲下,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後,並沒有掛起當前線程,因此是非阻塞。