并發(fā)編程ConcurrentLinkedQueue示例詳解
ConcurrentLinkedQueue
ConcurrentLinkedQueue是非阻塞線程安全的隊列,適用于高并發(fā)的場景。是一個基于鏈接節(jié)點的無界線程安全隊列,按照 FIFO(先進先出)原則對元素進行排序。隊列元素中不可以放置null元素(內部實現(xiàn)的特殊節(jié)點除外)

ConcurrentLinkedQueue原理
- ConcurrentLinked是由鏈表結構組成的線程安全的先進先出無界隊列。
- 當多線程要共享訪問集合時,ConcurrentLinkedQueue是一個比較好的選擇。
- 不允許插入null元素
- 支持非阻塞地訪問并發(fā)安全的隊列,不會拋出ConcurrentModifiationException異常。
- size方法不是準確的,因為在統(tǒng)計集合的時候,隊列可能正在添加元素,導致統(tǒng)計不準。
- 批量操作addAll、removeAll、retainAll、containsAll、equals和toArray不保證原子性(操作不可分割)
- 添加元素happen-before其他線程移除元素。
ConcurrentLinkedQueue類繼承AbstractQueue抽象類
具有隊列的功能;實現(xiàn)了Queue接口,可作為隊列使用。
- ConcurrentLinkedQueue繼承于AbstractQueue。
- ConcurrentLinkedQueue內部是通過鏈表來實現(xiàn)的。同時包含鏈表的頭節(jié)點head和尾節(jié)點tail。
- ConcurrentLinkedQueue按照 FIFO(先進先出)原則對元素進行排序。元素都是從尾部插入到鏈表,從頭部開始返回。
- ConcurrentLinkedQueue的鏈表Node中的next的類型是volatile,而且鏈表數(shù)據(jù)item的類型也是volatile。ConcurrentLinkedQueue就是通過volatile來實現(xiàn)多線程對競爭資源的互斥訪問的。
- 其中head節(jié)點存放鏈表第一個item為null的節(jié)點,tail則并不是總指向最后一個節(jié)點
ConcurrentLinkedQueue操作方法
private transient volatile Node<E> head;
private transient volatile Node<E> tail;
public ConcurrentLinkedQueue() {
head = tail = new Node<E>(null);
}
構造函數(shù)中,新建了一個“內容為null的節(jié)點”,并設置表頭head和表尾tail的值為新節(jié)點。 head和tail是volatile類型,具有volatile賦予的含義:“即對一個volatile變量的讀,總是能看到(任意線程)對這個volatile變量最后的寫入”。
private static class Node<E> {
volatile E item;
volatile Node<E> next;
Node(E item) {
UNSAFE.putObject(this, itemOffset, item);
}
}
Node是單向鏈表節(jié)點,next指向下一個Node,item用于存儲數(shù)據(jù)。Node中操作節(jié)點數(shù)據(jù)的API,是通過Unsafe機制的CAS函數(shù)實現(xiàn)的;例如casNext()是通過CAS函數(shù)“比較并設置節(jié)點的下一個節(jié)點”。
1、添加
以add(E e)為例對ConcurrentLinkedQueue中的添加
public boolean add(E e) {
return offer(e);
}
add()實際上是調用的offer()來完成添加操作的;offer(E e)的作用就是將元素e添加到鏈表的末尾。
2、刪除
poll():在鏈表頭部獲取并且移除一個元素
poll()的作用就是刪除鏈表的表頭節(jié)點,并返回被刪節(jié)點對應的值。
3、peek操作
peek操作是獲取鏈表頭部一個元素(只讀取不移除)。
以上就是并發(fā)編程ConcurrentLinkedQueue示例詳解的詳細內容,更多關于并發(fā)編程ConcurrentLinkedQueue的資料請關注腳本之家其它相關文章!
相關文章
springboot發(fā)送request請求的方式小結
在Java中,發(fā)送HTTP請求是常見需求,hutool工具包和RestTemplate類是實現(xiàn)此功能的兩種主流方法,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2024-09-09
springMVC中@RequestParam和@RequestPart的區(qū)別
本文主要介紹了springMVC中@RequestParam和@RequestPart的區(qū)別,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2024-06-06

