概述
ConcurrentLinkedQueue 是 Java 并发包(java.util.concurrent)中提供的无界非阻塞线程安全队列,基于单向链表实现,采用 CAS(Compare-and-Swap) 操作和 无锁算法 保证并发安全。其核心设计目标是高吞吐量和低延迟,适用于高并发场景下的生产者 - 消费者模型。
关键特性
- 无界性:理论上容量无限,但受内存限制。
- 非阻塞:操作永不阻塞线程,失败立即返回(如
poll()在队列为空时返回null)。 - 无锁设计:通过 CAS 和自旋机制实现线程安全,避免传统锁的开销。
- FIFO 顺序:严格遵循先进先出原则。
- 弱一致性迭代器:遍历时可能看到部分更新,但不会抛出
ConcurrentModificationException。
内部数据结构
节点类 Node
private static class Node<E> {
volatile E item; // 存储元素
volatile Node<E> next; // 指向下一个节点
// CAS 操作方法
boolean casItem(E cmp, E val) { ... }
boolean casNext(Node<E> cmp, Node<E> val) { ... }
}
- volatile 修饰:保证多线程可见性。
- CAS 操作:通过
Unsafe类实现原子性更新。
队列指针
- head:指向队列头部(可能滞后于实际头节点)。
- tail:指向队列尾部(可能滞后于实际尾节点)。
- 哨兵节点:初始化时
head和tail均指向一个item=null的哨兵节点。
核心方法与实现原理
入队操作(offer/add)
public boolean offer(E e) {
checkNotNull(e);
Node<E> newNode = <>(e);
(Node<E> t = tail, p = t;;) {
Node<E> q = p.next;
(q == ) {
(p.casNext(, newNode)) {
(p != t) casTail(t, newNode);
;
}
} (p == q) {
p = (t != (t = tail)) ? t : head;
} {
p = (p != t && t != (t = tail)) ? t : q;
}
}
}


