線程安全的隊列ConcurrentLinkedQueue

  實現線程安全的隊列有兩種方式:一種是使用阻塞算法,另外一種是使用非阻塞算法。算法

1.阻塞算法的隊列可使用鎖的方式來實現。安全

2.非阻塞的實現方法則可使用循環CAS的方式來實現。線程

       ConcurrentLickedQueue使用非阻塞的方式實現線程安全隊列。是一個基於連接節點的無界線程安全隊列,它採用先進先出的規則對節點進行排序,添加一個元素的時候,它會添加到隊列的尾部;當咱們獲取一個元素時,它會返回隊列頭部的元素。排序

      ConcurrentLinkedQueue由head節點和tail節點組成,每一個節點(Node)由節點元素和指向下一個節點(next)的引用組成,節點與節點都是經過next關聯起來,從而組成一張鏈表結構的隊列。隊列

入隊列:循環

入隊列主要作兩件事: 1.定位出尾節點 2.使用CAS算法將入隊列節點設置成尾節點的next節點引用

定位尾節點: tail節點並非尾節點,因此每次入隊都必須先經過tail節點來找到尾節點。尾節點多是tail節點,也多是tail節點的next節點。方法

設置入隊節點爲尾節點: p.casNext(null,n)方法用於將入隊節點設置爲當前隊列尾節點的next節點。若是p是null,表示p是當前隊列的尾部節點,若是不爲null,表示有其餘更新了尾節點,則須要從新獲取當前隊列的尾部節點。線程安全

 

出隊列:鏈表

      出隊列就是從隊列裏返回一個節點元素,並清空該節點對元素的引用。並非每次出隊列都更新head節點,當head節點裏有元素的時候,直接彈出head節點裏的數據,而不會更新head節點。只有當head節點裏沒有元素時,出隊操做纔會更新head節點。

       首先獲取頭節點的元素,而後判斷頭結點元素是否爲空,若是爲空,表示另一個線程已經進行了一次出隊操做將節點的元素取走,若是不爲空,則使用CAS的方式將頭結點的引用設置爲null,若是CAS成功,則直接返回頭結點的元素,若是不成功,表示另一個線程已經進行了一次出隊操做更新了head節點,致使元素髮生了變化,須要從新獲取頭部節點。

相關文章
相關標籤/搜索