如何理解同步/非同步、阻塞非/阻塞、並行/併發?
同步非同步常常會拿來和阻塞非阻塞放在一起討論。
因為它們似乎看起來很像,而且通常配套出現。
非同步/同步
但實際上,同步和非同步關注的是:獲得結果的方式。
同步是自己等待結果,主動獲得結果。
非同步是等對方完成後通知自己結果,被動得到結果。
回撥函式就是非同步的一種通知形式。
非阻塞/阻塞
而阻塞和非阻塞,關注的是:執行緒的狀態。
當執行緒遇到需要等待結果的時,會把執行緒掛起,那這種機制就是阻塞,而不會掛起的機制就是非阻塞。
搭配
同步非同步與阻塞和非阻塞,理論上沒有必然關聯,兩者關注的點不一樣。
但通常,我們能夠看到大多數程式,要麼是同步阻塞的,要麼是非同步非阻塞的,為什麼呢?
這是因為,非同步只有和非阻塞搭配在一起,才有意義,而同步通常和阻塞搭配在一起。
比如:當你發起一個呼叫,呼叫沒能及時給你結果,你把它先晾在一邊(非阻塞),等到它有了結果,他會通知你呼叫結束了(非同步)。
我們可以看得出來,上面非同步非阻塞搭配在一起,效率才是最高的,你可以完全不管這個呼叫,去做別的事情。
現實中不會存在同步非阻塞或非同步阻塞的程式,因為實現非同步機制,出發點就是為了讓執行緒不要等待呼叫的返回,而不等待又是為了什麼?就是為了能夠繼續執行別的任務,這時候就需要非阻塞機制來使執行緒繼續工作。
反過來,同步和阻塞自然是一起的,我既然需要等待結果返回,當然什麼事也不做了,執行緒也不必再繼續工作。
並行/併發
並行,物理上只有多核處理器才能真正意義上達到,是指同一時刻 執行。
併發,軟體層面所認為的同時進行,是指同一時間段 執行。