java并发编程实战-48-并发容器ConcurrentLinkedQueue原理与使用

线程安全:

syn。。。

volatile

cas

-------------------------------

实例化会创建一个头节点。

添加节点是判断tail的下一个节点的指向是不是空,是空则tail就指向下一个节点。

再次来一个:tail的下一个节点不是空的,则p指向tail下一个节点。q指向tail,q指向p。

p指向q下一个节点。。。。。。很乱07:12

tail不一定指向最后一个节点。

-----------------

移除:head不一定一直指向头节点

-----------------

总结:cas增加节点,q指向下一个节点是cas操作的。设置头尾节点。

首先初始化创建了一个节点

public ConcurrentLinkedDeque() {
        head = tail = new Node<E>(null);
    }

入队

 private void linkLast(E e) {
        checkNotNull(e);//为空 创建一个空指针异常即可
        final Node<E> newNode = new Node<E>(e);

        restartFromTail:
        for (;;)
            for (Node<E> t = tail, p = t, q;;) {
                if ((q = p.next) != null &&
                    (q = (p = q).next) != null)
                    p = (t != (t = tail)) ? t : q;
                else if (p.prev == p) 
                    continue restartFromTail;
                else {
                    //p是组后一个节点
                    newNode.lazySetPrev(p); 
                    if (p.casNext(null, newNode)) {
                            if (p != t) // hop two nodes at a time
                            casTail(t, newNode);  
                        return;
                    }
                }
            }
    }

   入队,又来了一个节点,这个是链表记住了。

  出队:

 

 private void linkFirst(E e) {
        checkNotNull(e);
        final Node<E> newNode = new Node<E>(e);

        restartFromHead:
        for (;;)
            for (Node<E> h = head, p = h, q;;) {
                if ((q = p.prev) != null &&
                    (q = (p = q).prev) != null)
                    // Check for head updates every other hop.
                    // If p == q, we are sure to follow head instead.
                    p = (h != (h = head)) ? h : q;
                else if (p.next == p) // PREV_TERMINATOR
                    continue restartFromHead;
                else {
                    // p is first node
                    newNode.lazySetNext(p); // CAS piggyback
                    if (p.casPrev(null, newNode)) {
                        // Successful CAS is the linearization point
                        // for e to become an element of this deque,
                        // and for newNode to become "live".
                        if (p != h) // hop two nodes at a time
                            casHead(h, newNode);  // Failure is OK.
                        return;
                    }
                    // Lost CAS race to another thread; re-read prev
                }
            }
    }

 -----------------

这个博客没看懂啊。

-------------------------------------------------------------------------------------------------------------------------

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值