ConcurrentLinkedQueue使用了Unsafe的cas机制保证了线程的安全,用peek方法为例
public class ConcurrentLinkedQueue<E> extends AbstractQueue<E> implements Queue<E>, java.io.Serializable { private static final sun.misc.Unsafe UNSAFE; private transient volatile Node<E> head; private transient volatile Node<E> tail; private boolean casHead(Node<E> cmp, Node<E> val) { return UNSAFE.compareAndSwapObject(this, headOffset, cmp, val); } //以peek为例, public E peek() { restartFromHead: for (;;) { for (Node<E> h = head, p = h, q;;) { E item = p.item; //当找到值,或者到最后一个节点的时候 if (item != null || (q = p.next) == null) { //判断head是不是和原来的一样,如果一样将P设置为head updateHead(h, p); return item; } else if (p == q) continue restartFromHead; else p = q; } } } /** * Try to CAS head to p. If successful, repoint old head to itself * as sentinel for succ(), below. */ final void updateHead(Node<E> h, Node<E> p) { if (h != p && casHead(h, p)) h.lazySetNext(h); } }