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节点
最后就是返回一个“张三”值,队列头部的值