今天来说一说ConcurrentLinkedQueue类,ConcurrentLinkedQueue类是线程安全的非阻塞无界的FIFIO队列,通过CAS算法进行入队和出队。
ConcurrentLinkedQueue类中主要的成员变量如下:
private transient volatile Node head; //内部双向列表的头节点,volatile保证内存可见性。
private transient volatile Node tail; //内部双向列表的尾节点,volatile保证内存可见性。
private static final sun.misc.Unsafe UNSAFE;//UNSAFE实例用来执行CAS算法。
下面对ConcurrentLinkedQueue类中常用方法源码进行介绍。
offer(E e)
在队列尾部添加一个指定元素,由于队列是无界的,所以该方法一直会返回true。由于使用CAS算法,所有线程不会被阻塞挂起。
public boolean offer(E e) {
//(1)检查参数是否为null,是则抛出空指针异常
checkNotNull(e);
final Node newNode =new Node(e);
for (Node t =tail, p = t;;) {
Node q = p.next;
//(2)如果q为null,说明p是尾部节点,则进行插入操作
if (q ==null) {
// (3)使用CAS算法设置p的next节点
if (p.casNext(null, newNode)) {
//(4)CAS成功,则说明新增节点已经插入到链表,然后设置当前尾节点。
if (p != t)
casTail(t, newNode); // (5)尾结点的设置允许失败,不影响后序的操作。
return true;
}
}
else if (p == q)
//(6)多线程操作时,由于poll操作移除元素后可能会把head变为自引用,也就是head的next还是head,这个时候需要重新找新的head
p = (t != (t =tail))

最低0.47元/天 解锁文章

被折叠的 条评论
为什么被折叠?



