多线程并发编程11-ConcurrentLinkedQueue源码剖析

    今天来说一说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))

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值