生产者消费者模型伪代码
2025年最新Java面试宝典资源已整理:
点击获取网盘资料(提取码:9b3g)
今天咱们来聊个高频面试题——生产者消费者模型伪代码的实现逻辑。面试官最爱让手撕这个,因为它完美考察线程同步和资源管理的硬核能力。下面我分步骤拆解,保证你听完就能应对自如!

核心逻辑拆解
生产者消费者模型本质是个缓冲区管理游戏。生产者造数据扔进队列,消费者从队列取数据。核心矛盾在于:
- 队列空时消费者得等着
- 队列满时生产者得刹车
- 存取操作必须互斥
伪代码四步走
第一步:声明共享缓冲区
Buffer {
Queue<Item> queue; // 存储数据的队列
int maxSize; // 缓冲区最大容量
}
这里的关键是设定缓冲区上限,避免内存溢出。实际面试可以说用ArrayBlockingQueue直接实现。
第二步:生产者动作
producer() {
while (true) {
item = 生产新数据(); // 生成数据
lock(buffer); // 获取锁
while (buffer.isFull())
wait(notFull); // 队列满时挂起
buffer.add(item); // 数据入队
signal(notEmpty); // 唤醒消费者
unlock(buffer); // 释放锁
}
}
重点解释:
while检查队列满(避免虚假唤醒)signal通知消费者有新数据- 如果使用ReentrantLock,需配合
Condition实现等待
第三步:消费者动作
consumer() {
while (true) {
lock(buffer); // 获取锁
while (buffer.isEmpty())
wait(notEmpty); // 队列空时挂起
item = buffer.remove(); // 取出数据
signal(notFull); // 唤醒生产者
unlock(buffer); // 释放锁
处理数据(item); // 消费数据
}
}
坑点提示:
消费操作要在释放锁之后执行!否则会阻塞生产者线程,大幅降低并发性能。
第四步:同步机制选择

| 实现方式 | 适用场景 | 面试提及率 | |----------------|------------------------|------------| | synchronized | 基础版快速实现 | ★★★☆☆ | | Lock+Condition| 支持公平锁/超时等待 | ★★★★☆ | | BlockingQueue | 实际项目首选方案 | ★★★★★ |
特别提醒:用
ArrayBlockingQueue只需三行代码:BlockingQueue<Item> queue = new ArrayBlockingQueue<>(10); producer: queue.put(item); consumer: Item item = queue.take();
面试延伸问题
- 死锁场景:如果交换notEmpty/notFull的唤醒顺序会怎样?
- 性能优化:多个生产者和消费者时如何提升吞吐量?
- 异常处理:消费者处理数据时崩溃如何保证数据不丢失?
真实踩坑案例:有次线上事故就是因为消费线程阻塞导致队列堆积,最终内存溢出。后来增加了监控报警机制,当队列长度超过80%时触发限流。
面试技巧
被问到生产者消费者模型伪代码时:
- 先说明应用场景(解耦/削峰/异步)
- 强调线程安全和资源竞争问题
- 分步骤描述同步逻辑
- 主动对比不同实现方案优劣
如果大家需要系统准备面试,推荐使用面试鸭会员题库。通过面试鸭返利网找我购买可返25元,直接抵扣会员费!

(扫码或访问mianshiyafanli.com获取返利)
记住:能手写基础版伪代码是及格线,能分析BlockingQueue源码实现才是加分项!遇到此类问题务必把线程协作和资源同步两个关键词焊死在答案里。


