Java生产者消费者模型是通过共享缓冲区协调多线程协作的经典并发模式,核心是生产者只放、消费者只取,由缓冲区实现同步、限流与解耦,解决速率不匹配问题,具备解耦、线程安全和弹性伸缩三大价值。
Java中的生产者消费者模型,是一种通过共享缓冲区协调多线程协作的经典并发设计模式。它的核心不是让生产者和消费者直接通信,而是让它们各自独立地与一
个中间容器(比如队列)交互——生产者只管“放”,消费者只管“取”,由缓冲区承担同步、限流与解耦职责。
在真实系统中,生产数据的速度和处理数据的速度往往不一致。比如日志生成极快,但写磁盘较慢;或任务创建频繁,但执行线程有限。若强行让生产者等消费者完成再继续,CPU大量空转;若不加控制任由生产者狂塞,又会内存溢出或丢数据。该模型用有限容量的缓冲区吸收节奏差,实现“削峰填谷”。
它带来的三个关键价值是:
一个最小可行实现包含三部分:
LinkedList 或循环数组),封装 produce() 和 consume() 方法,并内置等待/唤醒逻辑buffer.produce(item);若缓冲区满,则阻塞等待(如 wait() 或 put() 阻塞)buffer.consume();若缓冲区空,则阻塞等待(如 wait() 或 take() 阻塞)关键细节在于:每次成功放入或取出后,必须调用 notifyAll()(或对应信号量 release),否则等待线程可能永远沉睡。
Java 提供了三种成熟路径,适用不同场景:
ArrayBlockingQueue 或 LinkedBlockingQueue,一行代码完成阻塞、唤醒、线程安全,开发效率高,工业级首选该模型不是理论玩具,而是广泛落地于实际系统:
Runnable 放入工作队列;工作线程是消费者,从中取任务执行