第十四篇:ConcurrentLinkedQueue的源碼解析(基於JDK1.8)

ConcurrentLinkedQueue的定義

ConcurrentLinkedQueue是 非阻塞的單端隊列,其是一個通過鏈表實現的併發安全的隊列。是java中併發環境下性能最好的隊列,它是使用非阻塞算法(CAS)來實現線程安全的。它採用先進先出的規則對節點進行排序,當我們添加一個元素時,它會添加到隊列的尾部;當我們獲取一個元素時,它會返回隊列頭部的元素。

ConcurrentLinkerQueue 不變式

在後面的源碼分析中,我們將會看到隊列裏有時會處於不一致狀態,爲此,ConcurrentLinkedQueue使用三個不變式(基本不變式,head的不變式和tail的不變式),來約束隊列中方法的執行。通過這三個不變式來維護非阻塞算法的正確性。

基本不變式

在執行方法之前和之後,隊列必須要保持的不變式;
當入隊插入節點之後,隊列中有一個next域爲null的(最後)節點
從head開始遍歷隊列,可以訪問所有item域不爲null的節點。

head的不變式和可變式

不變式(invariants)
1.在執行方法之前和之後,head必須保持的不變式;
2. 所有"活着"的節點(只未刪除節點)都能從head通過調用succ()方法遍歷可達。
3.head不能爲null。
可變式(Non-invariants)
1.head節點的item域可能爲null,也可能不爲null。
2.允許tail之後與head,也就是調用succ()方法,從head不可達tail。

tail的不變式和可變式

不變式

  1. tail 節點通過succ()方法一定到達隊列中的最後一個節點(node.next=null)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章