阻塞,blocking
一個方法被稱為阻塞的,即這個方法在其演進過程中不能正常運行直到其他(占有鎖的)線程釋放。
也就是普通的synchronized方法,同一時間內只有一個線程占有了鎖,其他線程只能等待。但是這個占有鎖的線程並不一定真的在工作(可能被掛起了)。
無鎖,lock-free
An algorithm is lock-free if, when the program threads are run for a sufficiently long time, at least one of the threads makes progress (for some sensible definition of progress).
如果所有線程運行了足夠長時間后,至少有一個線程能獲得進展,那么這個算法是無鎖的。
用人話講就是:系統中無論何時,始終有一個線程在工作。
無等待,wait-free
An algorithm is wait-free if every operation has a bound on the number of steps the algorithm will take before the operation completes.
假如一個方法是無等待的,那么它保證了每一次調用都可以在有限的步驟內結束。
用人話講就是,系統中的所有線程,都會在有限時間內結束,無論如何也不可能出現餓死(starving)的情況。
再通俗一點的說:
阻塞算法可能會出現整個系統都掛起的情況(占有鎖的線程被中斷,那么所有試圖爭用這個鎖的線程會被掛起),系統中的所有線程全部餓死
無鎖算法可以保證系統中至少有一個線程處於工作狀態,但是還是可能有線程永遠搶不到資源而被餓死
無等待算法保證系統中的所有線程都能處於工作狀態,沒有線程會被餓死,只要時間夠,所有線程都能結束。
The difference between wait-free and lock-free is that wait-free operation by each process is guaranteed to succeed in a finite number of steps, regardless of the other processors.
補充:
集居數無關無等待,Wait-Free-Population-Oblivious
一個無等待的方法,如果其性能和活動線程數目無關,那么被稱為集居數無關無等待的。
這個是更強的wait-free算法,因為一般的wait-free中的每個線程雖然能在有限步數內結束,但是實際上它的開銷往往與並發的線程數有關。可能工作線程越多,平均到每個線程頭上的耗時就越長。
而集居數無關無等待算法則可以理解為:線程的平均開銷是一個與並發數n無關的函數。
也就是說,我們可以通過無限制的增加線程數來提高總的工作效率(而且是線性擴展)。
參考資料
https://en.wikipedia.org/wiki/Non-blocking_algorithm#Wait-freedom