併發程式設計ConcurrentLinkedQueue使用示例詳解

大雄45發表於2023-01-31
導讀 這篇文章主要為大家介紹了併發程式設計ConcurrentLinkedQueue使用示例詳解,有需要的朋友可以借鑑參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
ConcurrentLinkedQueue

ConcurrentLinkedQueue是非阻塞執行緒安全的佇列,適用於高併發的場景。是一個基於連結節點的無界執行緒安全佇列,按照 FIFO(先進先出)原則對元素進行排序。佇列元素中不可以放置null元素(內部實現的特殊節點除外)

併發程式設計ConcurrentLinkedQueue使用示例詳解併發程式設計ConcurrentLinkedQueue使用示例詳解

ConcurrentLinkedQueue原理
  • ConcurrentLinked是由連結串列結構組成的執行緒安全的先進先出無界佇列。
  • 當多執行緒要共享訪問集合時,ConcurrentLinkedQueue是一個比較好的選擇。
  • 不允許插入null元素
  • 支援非阻塞地訪問併發安全的佇列,不會丟擲ConcurrentModifiationException異常。
  • size方法不是準確的,因為在統計集合的時候,佇列可能正在新增元素,導致統計不準。
  • 批次操作addAll、removeAll、retainAll、containsAll、equals和toArray不保證原子性(操作不可分割)
  • 新增元素happen-before其他執行緒移除元素。
  • ConcurrentLinkedQueue類繼承AbstractQueue抽象類

    具有佇列的功能;實現了Queue介面,可作為佇列使用。

  • ConcurrentLinkedQueue繼承於AbstractQueue。
  • ConcurrentLinkedQueue內部是透過連結串列來實現的。同時包含連結串列的頭節點head和尾節點tail。
  • ConcurrentLinkedQueue按照 FIFO(先進先出)原則對元素進行排序。元素都是從尾部插入到連結串列,從頭部開始返回。
  • ConcurrentLinkedQueue的連結串列Node中的next的型別是volatile,而且連結串列資料item的型別也是volatile。ConcurrentLinkedQueue就是透過volatile來實現多執行緒對競爭資源的互斥訪問的。
  • 其中head節點存放連結串列第一個item為null的節點,tail則並不是總指向最後一個節點
  • ConcurrentLinkedQueue操作方法
private transient volatile Nodehead;
private transient volatile Nodetail;
public ConcurrentLinkedQueue() {
    head = tail = new Node(null);
}

建構函式中,新建了一個“內容為null的節點”,並設定表頭head和表尾tail的值為新節點。 head和tail是volatile型別,具有volatile賦予的含義:“即對一個volatile變數的讀,總是能看到(任意執行緒)對這個volatile變數最後的寫入”。

private static class Node{
    volatile E item;
    volatile Nodenext;
    Node(E item) {
        UNSAFE.putObject(this, itemOffset, item);
    }
}

Node是單向連結串列節點,next指向下一個Node,item用於儲存資料。Node中操作節點資料的API,是透過Unsafe機制的CAS函式實現的;例如casNext()是透過CAS函式“比較並設定節點的下一個節點”。

1、新增

以add(E e)為例對ConcurrentLinkedQueue中的新增

public boolean add(E e) {
  return offer(e);
}

add()實際上是呼叫的offer()來完成新增操作的;offer(E e)的作用就是將元素e新增到連結串列的末尾。

2、刪除

poll():在連結串列頭部獲取並且移除一個元素

poll()的作用就是刪除連結串列的表頭節點,並返回被刪節點對應的值。

3、peek操作

peek操作是獲取連結串列頭部一個元素(只讀取不移除)。

原文來自: https://www.linuxprobe.com/concurrent-linked-queue.html


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69955379/viewspace-2933055/,如需轉載,請註明出處,否則將追究法律責任。

相關文章