同步(Synchronous)和異步(Asynchronous)
同步方法調用一旦開始,調用者必須等待方法調用返回后才能繼續后續行為。異步方法調用更像一個消息傳遞,一旦開始就立即返回,調用者就可以繼續后續的操作。而被調用的異步方法會在另外一個線程里真實地執行。如果異步調用需要返回結果,那么當這個調用真實完成的時候,則會通知調用者。
并發(Concurrency)和并行(Parallelism)
這兩個概念非常容易被混淆,它們都可以表示多個任務一起執行,但并發偏重于多個任務交替執行,而多個任務之間可能還是串行,讓外部的觀察者看起來像是并行;而并行是真正意義上的同時執行。
實際上,如果系統內只有一個單核 CPU,那么多線程或者多進程任務不可能是真實并行的,畢竟一個 CPU 一次只能執行一條指令,這樣只能叫做并發而不是并行;真實的并行只可能出現在多個單核和/或者多核 CPU 中。
臨界區
臨界區表示一種公共資源,可以被多個線程使用。但是每一次只能有一個線程使用它,一旦臨界區資源被占用,其他線程想要使用它就必須等待。
阻塞(Blocking)和非阻塞(Non-Blocking)
通常用來形容多個線程之間的相互影響。比如一個線程占用了臨界區資源,那么其他所有需要這個資源的線程就必須等待,直到這個線程釋放了這個資源。這種情況就是阻塞;非阻塞代表沒有一個線程可以妨礙其他線程執行,所有的現成都會嘗試不斷執行下去。
死鎖(Deadlock)、饑餓(Starvation)和活鎖(Livelock)
多個線程占有了其每個線程都需要的資源,你不讓我我不讓你,造成程序無法繼續執行下去,這就是死鎖;饑餓是指某個或多個線程一直等不到所需的資源導致一直無法執行,或者一個線程一直占有資源不釋放,其余線程一直在嘗試獲取這個資源;活鎖是指每個線程都主動地將資源釋放給別人用,那么就沒有任何一個線程能夠順利占有這個資源執行。
并發級別
阻塞(Blocking)
一個線程是阻塞的,那么在其他線程釋放之前,這個線程是無法執行的。無饑餓(Starvation-Free)
如果鎖是公平的,不管新來的線程優先級有多高,想要獲得資源,也必須排隊等待前面有可能優先級比較低的先使用資源,這樣所有的線程都有機會執行。無障礙(Obstr-Free)
多個進程可以一起進入臨界區獲取資源。為了避免在資源被多個線程修改導致一致性問題發生,其每個線程會在修改資源后進行回滾操作確保數據安全。但是依然會有一個問題就是資源修改的沖突特別大的時候,會導致每個線程一直在回滾,沒有一個線程能夠走出臨界區。無鎖(Lock-Free)
無鎖的并行都是無障礙的,但不同的是無鎖的并發保證了必然有一個線程能夠在有限步驟內離開臨界區。無等待(Wait-Free)
無等待是要求所有的無障礙線程必須全部在有限步驟內離開臨界區,這樣就不會遇到饑餓問題。