java中ConcurrentLinkedQueue的入队

本文教程操作环境:windows7系统、jquery3.2.1版本,DELL G3电脑。

1.入队说明

入队列就是将入队节点添加到队列的尾部。为了方便理解入队时队列的变化,以及head节点和tair节点的变化,每添加一个节点我就做了一个队列的快照图。

2.入队过程

从源代码角度来看整个入队过程主要做二件事情。

(1)定位出尾节点,

(2)使用CAS算法能将入队节点设置成尾节点的next节点,如不成功则重试。

3.入队实例

add()和offer()都是加入元素的方法(在ConcurrentLinkedQueue中,这两个方法没有任何区别)。

/**
*入队一个元素.
*
*@throwsNullPointerException元素不能为null
*/
publicbooleanadd(Ee){
returnoffer(e);
}

/**
*在队尾入队元素e,直到成功
*/
publicbooleanoffer(Ee){
checkNotNull(e);
finalNode<E>newNode=newNode<E>(e);
for(Node<E>t=tail,p=t;;){//自旋,直到插入结点成功
Node<E>q=p.next;
if(q==null){//CASE1:正常情况下,新结点直接插入到队尾
if(p.casNext(null,newNode)){
//CAS竞争插入成功
if(p!=t)//CAS竞争失败的线程会在下一次自旋中进入该逻辑
casTail(t,newNode);//重新设置队尾指针tail
returntrue;
}
//CAS竞争插入失败,则进入下一次自旋

}elseif(p==q)//CASE2:发生了出队操作
p=(t!=(t=tail))?t:head;
else
//将p重新指向队尾结点
p=(p!=t&&t!=(t=tail))?t:q;
}
}

原文来自:https://www.py.cn

© 版权声明
THE END
喜欢就支持一下吧
点赞6 分享
评论 抢沙发
头像
欢迎您留下宝贵的见解!
提交
头像

昵称

取消
昵称表情代码图片

    暂无评论内容