1. 生产者消费者问题概述
生产者消费者问题(Producer-Consumer Problem)是操作系统中经典的并发编程案例,它描述了两个或多个进程(线程)共享固定大小缓冲区时存在的同步问题。我在实际开发分布式消息队列系统时,曾因对这个问题的理解不足导致过严重的数据一致性问题。
这个问题的核心矛盾在于:生产者不断生成数据放入缓冲区,消费者从缓冲区取出数据使用。当缓冲区满时生产者必须等待,缓冲区空时消费者必须等待。在多线程环境下,如果没有正确的同步机制,就会导致:
- 数据竞争(Data Race):多个线程同时修改共享缓冲区
- 死锁(Deadlock):线程互相等待对方释放资源
- 活锁(Livelock):线程不断改变状态却无法继续执行
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 问题场景与核心挑战
2.1 典型应用场景
现代软件系统中随处可见生产者消费者模式的身影:
- 消息队列(Kafka/RabbitMQ):生产者发消息,消费者处理消息
- 线程池任务调度:主线程提交任务,工作线程执行任务
- 日志收集系统:应用产生日志,日志处理器消费日志
- 图像处理流水线:摄像头生产图像帧,算法消费处理
2.2 必须解决的三大核心问题
- 互斥访问:缓冲区作为共享资源,必须保证同一时间只有一个线程访问
- 条件同步:
- 缓冲区满时阻塞生产者(await)
- 缓冲区空时阻塞消费者(await)
- 正确唤醒:
- 生产者添加数据后唤醒消费者(signal)
- 消费者取出数据后唤醒生产者(signal)
3. 解决方案实现与对比
3.1 基础实现:互斥锁+条件变量
这是最经典的解决方案,我在Java项目中最常使用这种方式:
java复制class BoundedBuffer {
final Lock lock = new ReentrantLock();
final Condition notFull = lock.newCondition();
final Condition notEmpty = lock.newCondition();
final Object[] items = new Object[100];
int
