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

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

