Java 并发系列十六 : 生产者-消费者模式-用流水线思想提高效率

前言

感谢王宝令老师在极客时间的并发课程

Worker Thread 模式类比的是工厂里车间工人的工作模式。 但是在现实世界中,工厂里还有一种流水线的工作模式,类比到编程领域就是 生产者-消费者模式。

生产者 - 消费者模式 在编程领域的应用也很广泛,前面我们提到,Java 线程池本质就是用生产者 - 消费者模式实现的, 所以每当使用线程池的时候,其实就是在应用生产者-消费者模式。

当然,除了在线程池中使用,为了提升性能,并发编程领域很多地方都使用了生产者-消费者模式,例如Log4j2 中异步 Appender 内部也用到了生产者 - 消费者模式。

生产者 - 消费者模式的优点

生产者-消费者的核心是一个任务队列,生产者线程生产任务,并将任务添加到任务队列中,而消费者线程从任务队列中获取任务并执行。下面是生产者-消费者模式的示意图:

img

从架构设计的角度来讲,生产者-消费者模式有一个很重要的优点,就是解耦。解耦对于大型系统的设计非常重要,而解耦的一个关键就是组件之间的依赖关系和通信方式必须受限。在生产者-消费者模式中,生产者和消费者没有任何依赖关系,他们彼此之间的通信只能通过任务队列。所以生产者-消费者是一个不错的解耦方案。

除了架构设计上的优点之外,生产者-消费者还有一个重要的优点就是支持异步,并且能够平衡消费者跟生产者的速度差异。在生产者-消费者模式中,生产者只需要将任务添加到任务队列而无需等待任务被消费者消费完毕。这就是和传统的调用方式的本质区别。

生产者-消费者模式在分布式计算中应用非常广泛,在分布式场景下你可以借助分布式消息队列(MQ)来实现生产者 - 消费者模式。 MQ 一般都支持两种消息模式,一种点对点的模型,一种是发布订阅模型,这两种的区别就是 点对点模型里一个消息只会被一个消费者消费。而发布订阅模型一个消息可以被多个消费者消费。本质上是一种消息的广播。

你可能感兴趣的:(Java 并发系列十六 : 生产者-消费者模式-用流水线思想提高效率)