无论是面试还是工作中,生产者和消费者模式一直是一个比较常见的问题,今天,我们用各种方式来实现它。

前言

生产者和消费者问题是线程模型中的经典问题:生产者和消费者在同一时间段内共用同一个存储空间,生产者往存储空间中添加产品,消费者从存储空间中取走产品,当存储空间为空时,消费者阻塞,当存储空间满时,生产者阻塞。

image

一、wait/notify/notifyAll实现

有一个天猫小店专门负责生产商品,用户也可以去买商品:

image

一个生产者的线程:

image

同理,一个消费者的线程:

image

下面进行测试:

image

此时的结果为:

image

由于生产大于消费,造成产能过剩。

二、阻塞队列实现

这个的实现已经在JUC组件拓展-BlockingQueue中实现了。不再赘述。主要就是用到阻塞的put()take()两个方法。

三、condition+Lock实现

这个也很简单,就是基于waitnotify的代码稍微改一下即可。

image

生产者改为:

image

消费者跟生产者一样的改法:

image

执行效果类似。关于Condition接口,在Condition详解这篇文章中进行了详细介绍。

其实还有一些其他的方式也可以实现生产者消费者模型,但是我觉得最核心的就是上面讲的三种,掌握这个就不慌了。