java中ConcurrentLinkedQueue的入队
本文教程操作环境:windows7系统、jquery3.2.1版本,DELL G3电脑。
1.入队说明
入队列就是将入队节点添加到队列的尾部。为了方便理解入队时队列的变化,以及head节点和tair节点的变化,每添加一个节点我就做了一个队列的快照图。
2.入队过程
从源代码角度来看整个入队过程主要做二件事情。
(1)定位出尾节点,
(2)使用CAS算法能将入队节点设置成尾节点的next节点,如不成功则重试。
3.入队实例
add()和offer()都是加入元素的方法(在ConcurrentLinkedQueue中,这两个方法没有任何区别)。
/*** 入队一个元素.
*
* @throws NullPointerException 元素不能为null
*/
public boolean add(E e) {
return offer(e);
}
/**
* 在队尾入队元素e, 直到成功
*/
public boolean offer(E e) {
checkNotNull(e);
final Node<E> newNode = new Node<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
return true;
}
// CAS竞争插入失败,则进入下一次自旋
} else if (p == q) // CASE2: 发生了出队操作
p = (t != (t = tail)) ? t : head;
else
// 将p重新指向队尾结点
p = (p != t && t != (t = tail)) ? t : q;
}
}
以上就是java中ConcurrentLinkedQueue的入队方法,同样是熟悉的offer方法为例带来介绍,同样add也是插入元素的一种方法,这里我们就不再介绍,感兴趣的可以课后了解。
以上是 java中ConcurrentLinkedQueue的入队 的全部内容, 来源链接: utcz.com/z/542522.html