194_再来看看基于复杂指针移动实现的单向链表的出队操作实现

5 阅读1分钟
public E poll() {
    restartFromHead:
    for (;;) {
        for (Node<E> h = head, p = h, q;;) {
            E item = p.item;

            if (item != null && p.casItem(item, null)) {
                // Successful CAS is the linearization point
                // for item to be removed from this queue.
                if (p != h) // hop two nodes at a time
                    updateHead(h, ((q = p.next) != null) ? q : p);
                return item;
            }
            else if ((q = p.next) == null) {
                updateHead(h, p);
                return null;
            }
            else if (p == q)
                continue restartFromHead;
            else
                p = q;
        }
    }
}

    poll,从队头出队

    if (item != null && p.casItem(item, null)) {

    基于CAS操作,将队列的头部元素的item值设置为null,因为是CAS操作,出队的操作只能是同一时间就一个线程可以成功

    通过一堆指针的变化,找到队列的头结点,通过CAS保证只有一个线程可以执行出队的操作,队列头部Node的item设置为null,原来的head Node给脱离出队列让jvm gc掉,head指针指向最新的头部的null节点

    最后就是返回一个“张三”值,队列头部的值