/**
在队列尾部插入节点
**/
public boolean offer(E e) {
if (e == null) throw new NullPointerException();
Node<E> n = new Node<E>(e, null);
for (;;) {
Node<E> t = tail;
Node<E> s = t.getNext();
if (t == tail) {
if (s == null) {
//s为null时,将n设置为t的下一个节点
if (t.casNext(s, n)) {
casTail(t, n);
return true;
}
} else {
//将s设置成尾结点
casTail(t, s);
}
}
}
}
1获取尾结点和尾结点的下一结点
2.如t是尾结点,执行3。否则执行1
3如果s(尾结点的下一结点)为null,执行4。否则执行5
4.如果设置尾结点的下一个结点成功,设置n为尾结点(如果这里设置不成功,其它线程会在5处设置尾结点),返回true。
5.设置t的下一个结点为尾结点