参考链接
生产者和消费者问题是线程模型中的经典问题:生产者和消费者在同一时间段内共用同一个存储空间,生产者往存储空间中添加产品,消费者从存储空间中取走产品,当存储空间为空时,消费者阻塞,当存储空间满时,生产者阻塞
作用
为了平衡生产者和消费者的处理能力,起到一个数据缓存的作用,同时也达到了一个解耦的作用
实现方式
wait()和notify()方法的实现
可重入锁ReentrantLock的实现
阻塞队列BlockingQueue的实现(最简单)
信号量Semaphore的实现
优点
解耦
将生产者类和消费者类进行解耦,消除代码之间的依赖性,简化工作负载的管理
复用
通过将生产者类和消费者类独立开来,那么可以对生产者类和消费者类进行独立的复用与扩展
调整并发数
由于生产者和消费者的处理速度是不一样的,可以调整并发数,给予慢的一方多的并发数, 提高任务的处理速度
异步
对于生产者和消费者来说能够 各司其职,生产者只需要关心缓冲区是否还有数据,不需要等待消费者处理完;同样的对于消费者来说,也只需要关注缓冲区的内容,不需要关注生产者
通过异步的方式支持高并发,将一个耗时的流程拆成生产和消费两个阶段,这样生产者因为执行put()的时间比较短,而支持高并发
支持分布式
生产者和消费者通过队列进行通讯,所以不需要运行在同一台机器上,在分布式环境中可以通过redis的list作为队列,而消费者只需要轮询队列中是否有数据
同时还能支持集群的伸缩性,当某台机器宕掉的时候,不会导致整个集群宕掉