無界的并發隊列,內部用單向鏈表實現。核心源碼如下
創新互聯從2013年創立,先為石樓等服務建站,石樓等地企業,進行企業商務咨詢服務。為石樓企業網站制作PC+手機+微官網三網同步一站式服務解決您的所有建站問題。
//節點
private static class Node{
volatile E item;
volatile Nodenext;
//創建node時不會有并發問題,直接寫入元素
Node(E item) {
UNSAFE.putObject(this, itemOffset, item);
}
......
}
//隊頭指針
private transient volatile Nodehead;
//隊尾指針
private transient volatile Nodetail;
public ConcurrentLinkedQueue() {
//初始頭和尾都指向空節點
head = tail = new Node(null);
}
//入隊
public boolean offer(E e) {
//空指針檢查
checkNotNull(e);
final NodenewNode = new Node(e);
for (Nodet = tail, p = t;;) {
//q指向p的后繼
Nodeq = p.next;
if (q == null) {//p是最后一個節點
if (p.casNext(null, newNode)) {//CAS操作,將newNode入隊,直到成功為止
if (p != t) //進入這個if分支說明 第一次循環p不是tail節點,走了外層else分支向后移動(其他線程入隊);
//CAS操作,將tail指向newNode,失敗了也沒關系,等下一個入隊線程更新。
casTail(t, newNode);
return true;
}
// CAS失敗了會由其他線程重新讀取
}
else if (p == q)
//到達隊尾
p = (t != (t = tail)) ? t : head;
else
//p不是最后一個節點,p移到下個位置
p = (p != t && t != (t = tail)) ? t : q;
}
}
//出隊
public E poll() {
restartFromHead:
for (;;) {
for (Nodeh = head, p = h, q;;) {
E item = p.item;
//CAS操作,將p的item成功置為null,就算出隊
if (item != null && p.casItem(item, null)) {
if (p != h) // 進入這個if分支說明 第一次循環p不是head節點,走了外層else分支向后移動(其他線程出隊);
//CAS操作,如果p的后繼不為空則head置為p的后繼,否則置為p,失敗也沒關系,等下一個出隊線程更新
updateHead(h, ((q = p.next) != null) ? q : p);
return item;
}
else if ((q = p.next) == null) {//如果隊列中為空
updateHead(h, p);
return null;
}
else if (p == q)
continue restartFromHead;
else
p = q;
}
}
}
你是否還在尋找穩定的海外服務器提供商?創新互聯www.cdcxhl.cn海外機房具備T級流量清洗系統配攻擊溯源,準確流量調度確保服務器高可用性,企業級服務器適合批量采購,新人活動首月15元起,快前往官網查看詳情吧
本文題目:(十一)并發集合——并發隊列-創新互聯
文章地址:http://vcdvsql.cn/article10/cdjcgo.html
成都網站建設公司_創新互聯,為您提供企業建站、網站排名、電子商務、服務器托管、ChatGPT、網站設計公司
聲明:本網站發布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創新互聯