class="java" name="code">/** 在队列尾部插入节点 **/ 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的下一个结点为尾结点