一、概述
LinkedBlockingQueue 是 Java 并发包(java.util.concurrent)中基于链表实现的阻塞队列,支持可选容量限制(默认无界),通过 双锁机制(ReentrantLock)和 条件变量(Condition)实现线程安全。其核心设计目标是高吞吐量和生产者 - 消费者模型的高效协作。
关键特性
- 线程安全:通过分离的
putLock(入队锁)和takeLock(出队锁)实现并发控制,减少锁竞争。 - 阻塞操作:
put()和take()方法在队列满或空时自动阻塞,支持超时等待。 - FIFO 顺序:严格遵循先进先出原则。
- 可选容量:构造时可指定最大容量(有界),默认无界(
Integer.MAX_VALUE)。 - 弱一致性迭代器:遍历时可能看到部分更新,但不会抛出
ConcurrentModificationException。
二、内部数据结构
1. 节点类 Node<E>
static class Node<E> {
E item; // 存储元素
Node<E> next; // 指向下一个节点
Node(E x) { item = x; }
}
- 链表结构:通过
head(头节点)和last(尾节点)维护队列顺序。 - 哨兵节点:初始化时
head和last均指向一个item=null的哨兵节点,简化边界处理。
2. 核心属性
| 属性 | 作用 |
|---|---|
capacity | 队列最大容量(默认 Integer.MAX_VALUE) |
count | 当前元素数量(AtomicInteger 保证原子性) |
putLock/takeLock | 入队和出队操作的独占锁 |
notEmpty/notFull | 条件变量,分别用于队列空和队列满时的线程阻塞与唤醒 |


