併發程式設計ConcurrentLinkedQueue使用示例詳解
導讀 | 這篇文章主要為大家介紹了併發程式設計ConcurrentLinkedQueue使用示例詳解,有需要的朋友可以借鑑參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪 |
ConcurrentLinkedQueue是非阻塞執行緒安全的佇列,適用於高併發的場景。是一個基於連結節點的無界執行緒安全佇列,按照 FIFO(先進先出)原則對元素進行排序。佇列元素中不可以放置null元素(內部實現的特殊節點除外)
- ConcurrentLinked是由連結串列結構組成的執行緒安全的先進先出無界佇列。
- 當多執行緒要共享訪問集合時,ConcurrentLinkedQueue是一個比較好的選擇。
- 不允許插入null元素
- 支援非阻塞地訪問併發安全的佇列,不會丟擲ConcurrentModifiationException異常。
- size方法不是準確的,因為在統計集合的時候,佇列可能正在新增元素,導致統計不準。
- 批次操作addAll、removeAll、retainAll、containsAll、equals和toArray不保證原子性(操作不可分割)
- 新增元素happen-before其他執行緒移除元素。
- ConcurrentLinkedQueue繼承於AbstractQueue。
- ConcurrentLinkedQueue內部是透過連結串列來實現的。同時包含連結串列的頭節點head和尾節點tail。
- ConcurrentLinkedQueue按照 FIFO(先進先出)原則對元素進行排序。元素都是從尾部插入到連結串列,從頭部開始返回。
- ConcurrentLinkedQueue的連結串列Node中的next的型別是volatile,而且連結串列資料item的型別也是volatile。ConcurrentLinkedQueue就是透過volatile來實現多執行緒對競爭資源的互斥訪問的。
- 其中head節點存放連結串列第一個item為null的節點,tail則並不是總指向最後一個節點
具有佇列的功能;實現了Queue介面,可作為佇列使用。
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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 併發程式設計之 ConcurrentLinkedQueue 原始碼剖析程式設計原始碼
- 併發程式設計——IO模型詳解程式設計模型
- 併發程式設計 — CAS 原理詳解程式設計
- Python AI程式設計助手AICodeHelper使用示例詳解PythonAI程式設計
- 併發程式設計——詳解 AQS CLH 鎖程式設計AQS
- Java併發程式設計(一)Thread詳解Java程式設計thread
- Java 併發程式設計(一) → LockSupport 詳解Java程式設計
- java併發程式設計 | 執行緒詳解Java程式設計執行緒
- Java併發程式設計系列之Semaphore詳解Java程式設計
- JUC併發程式設計詳解(通俗易懂)程式設計
- Java 併發程式設計 | 執行緒池詳解Java程式設計執行緒
- java併發之ConcurrentLinkedQueueJava
- java併發程式設計 | 鎖詳解:AQS,Lock,ReentrantLock,ReentrantReadWriteLockJava程式設計AQSReentrantLock
- Java併發程式設計中的鎖機制詳解Java程式設計
- Java併發程式設計(07):Fork/Join框架機制詳解Java程式設計框架
- Java併發程式設計(06):Lock機制下API用法詳解Java程式設計API
- Java併發程式設計的藝術,解讀併發程式設計的優缺點Java程式設計
- 十.Go併發程式設計--channel使用Go程式設計
- 併發程式設計程式設計
- JUC併發系列(八):併發程式設計常用輔助類CountDownLatch與CyclicBarrier(手敲程式碼示例)程式設計CountDownLatch
- 併發程式設計-9.在 .NET 中使用併發集合程式設計
- Golang併發程式設計程式通訊channel瞭解及簡單使用Golang程式設計
- Go 語言併發程式設計之互斥鎖詳解 sync.MutexGo程式設計Mutex
- java併發程式設計:Thread類的使用Java程式設計thread
- Go併發程式設計--正確使用goroutineGo程式設計
- 【Go併發程式設計】Goroutine的基本使用Go程式設計
- java併發程式設計系列:java併發程式設計背景知識Java程式設計
- 多執行緒高併發程式設計(11) -- 非阻塞演算法實現ConcurrentLinkedQueue原始碼分析執行緒程式設計演算法原始碼
- java 併發程式設計Java程式設計
- 併發程式設計—— LinkedTransferQueue程式設計
- 併發程式設計(ReentrantLock)程式設計ReentrantLock
- Go 併發程式設計Go程式設計
- golang併發程式設計Golang程式設計
- Golang 併發程式設計Golang程式設計
- Python併發程式設計Python程式設計
- 併發程式設計 synchronized程式設計synchronized
- 併發程式設計(四)程式設計
- 併發程式設計(二)程式設計