LinkedBlockingQueue是Java中基于链表的可选有界阻塞队列,通过putLock和takeLock两把锁实现高效线程安全,支持FIFO顺序和阻塞操作,常用于生产者-消费者模型;其构造时可指定容量,默认为Integer.MAX_VALUE,提供put、take、offer、poll等核心方法,使用时需注意设置合理容量以避免内存溢出,处理中断异常,并禁止插入null元素,适用于高并发场景,相比ArrayBlockingQueue具有更优的并发性能。

在Java中,LinkedBlockingQueue 是一个基于链表结构的可选有界阻塞队列,常用于多线程环境下实现线程安全的数据传递。它实现了 BlockingQueue 接口,内部通过独占锁(ReentrantLock)保证线程安全,适合生产者-消费者模型。
LinkedBlockingQueue 的基本特性
LinkedBlockingQueue 具备以下关键特点:
- 线程安全:使用两把锁(putLock 和 takeLock)分别控制入队和出队操作,提高并发性能。
- 可选容量限制:构造时可指定队列最大容量,默认为 Integer.MAX_VALUE,即无界队列。
- 先进先出(FIFO):元素按插入顺序被取出。
- 阻塞操作:当队列满时,插入操作阻塞;当队列空时,取出操作阻塞。
常用方法说明
以下是 LinkedBlockingQueue 提供的核心方法:
- put(E e):将元素插入队列,如果队列满则阻塞等待空间。
- take():从队列获取并移除头部元素,如果队列为空则阻塞等待元素。
- offer(E e):插入元素,成功返回 true,失败(如队列满)返回 false,不阻塞。
- poll(long timeout, TimeUnit unit):在指定时间内尝试取出元素,超时返回 null。
- size():返回当前队列中的元素数量。
生产者-消费者模型实战示例
下面是一个使用 LinkedBlockingQueue 实现生产者与消费者线程协作的完整例子:
立即学习“Java免费学习笔记(深入)”;
import java.util.concurrent.LinkedBlockingQueue;
public class ProducerConsumerExample {
private static final LinkedBlockingQueue queue = new LinkedBlockingQueue<>(5); // 容量为5
public static void main(String[] args) {
Thread producer = new Thread(() -> {
for (int i = 1; i <= 10; i++) {
try {
String item = "消息-" + i;
queue.put(item);
System.out.println("生产者发送:" + item);
Thread.sleep(500); // 模拟生产耗时
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
break;
}
}
});
Thread consumer = new Thread(() -> {
while (!Thread.interrupted()) {
try {
String item = queue.take();
System.out.println("消费者接收:" + item);
Thread.sleep(800); // 模拟消费耗时
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
break;
}
}
});
producer.start();
consumer.start();
try {
producer.join();
consumer.interrupt(); // 生产结束,中断消费者
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
}
}
}
在这个例子中:
- 队列容量设为5,防止内存无限增长。
- 生产者每500毫秒生成一条消息,调用 put 方法自动阻塞等待空间。
- 消费者每800毫秒处理一条消息,take 方法在队列为空时自动等待。
- 主线程等待生产完成,然后中断消费者线程。
使用建议与注意事项
实际开发中使用 LinkedBlockingQueue 需注意以下几点:
- 若未指定容量,会创建近似“无界”的队列,可能导致内存溢出,建议根据业务场景设置合理上限。
- put/take 方法会响应中断,务必处理 InterruptedException,避免线程无法正常退出。
- 适用于高并发读写场景,相比 ArrayBlockingQueue 使用双锁机制,并发性能更优。
- 不支持 null 元素,插入 null 会抛出 NullPointerException。
基本上就这些。LinkedBlockingQueue 是 Java 并发包中非常实用的线程安全队列,结合阻塞特性,能轻松实现稳定高效的生产者-消费者模式。合理使用,可大幅提升多线程程序的健壮性和可维护性。










