簡體   English   中英

無等待和無鎖算法的示例/說明

[英]Examples/Illustration of Wait-free And Lock-free Algorithms

我讀過無等待導致所有線程獨立完成,無鎖確保程序作為一個整體完成。 我無法完全理解。 誰能舉一個例子(java)來說明這一點。

編輯:無鎖是否意味着沒有死鎖的程序?

如果程序是無鎖的,這基本上意味着它的至少一個線程可以保證在任意時間段內取得進展。 如果一個程序死鎖,它的線程(以及整個程序)都不能取得進展——我們可以說它不是無鎖的。 由於無鎖程序可以保證取得進展,因此它們可以保證完成(假設無異常的有限執行)。

Wait-free 是一種更強的條件,這意味着無論線程執行的時間/順序如何,每個線程都可以保證在任意時間段內取得進展; 所以我們可以說線程是獨立完成的。 所有無等待程序都是無鎖的。

我不知道有哪些 Java 示例可以說明這一點,但我可以告訴您,無鎖/無等待程序通常是在沒有鎖的情況下使用低級原語(例如 CAS 指令)實現的。

無, Lock-free的手段,而不鎖的程序。 雖然,無wait-free算法也是無lock-free 然而,反之亦然不成立。 但是,盡管如此,兩者都是非阻塞算法

這個wiki 條目是一個很好的讀物,可以理解無鎖和無等待機制。

嗯, java.util.concurrent.atomic包是單變量lock-free編程的一個例子。 而在 Java 7 ConcurrentLinkedQueue是一個無wait-free實現的例子。

為了進一步了解,我希望您閱讀這篇文章, Brian Goetz撰寫的Going atomic他是編寫Java 並發實踐的人

從弱到強的條件:

如果一個方法保證無限頻繁地某些方法調用在有限數量的步驟中完成,則該方法是無鎖的

如果一個方法保證每個調用在有限數量的步驟中完成它的執行,那么它就是無等待的

顯然,任何無等待方法的實現也是無鎖的,但反之則不然。 無鎖算法承認某些線程可能會餓死的可能性。

然而,從“實際角度”來看,在很多情況下,飢餓雖然可能,但極不可能,因此快速無鎖算法可能比較慢的無等待算法更具吸引力。

注意:一個更強大的屬性稱為“有界等待”,這意味着:方法調用可以采取的步驟數是有界限的

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM