资讯专栏INFORMATION COLUMN

Jakartase_多线程 --- 线程的并发协作模式(一)生产者消费者模式

qianfeng / 1868人阅读

摘要:一简介多线程环境下,我们经常需要多个线程的并发和协作。这个时候,就需要了解一个重要的多线程并发协作模型生产者消费者模式。对于生产者没有生产产品之前,消费者要进入等待状态。分析不足在生产者消费者问题中,仅有是不够的。

一、简介

多线程环境下,我们经常需要多个线程的并发和协作。

这个时候,就需要了解一个重要的多线程并发协作模型 "生产者 / 消费者模式 "

模式简图

生产者:负责生产数据的模块(模块可能是:方法、对象、线程、进程)。

消费者:是负责处理数据的模块(模块可能是:方法、对象、线程、进程)。

缓冲区: 消费者不能直接使用生产者的数据,它们之间有个“缓冲区”。

缓冲区是实现并发的核心

生产者将生产好的数据放入“缓冲区”

消费者从“缓冲区”拿要处理的数据。

二、优点
2.1 解耦

2.1.1 耦合:如果生产者直接调用消费者的某个方法,生产者则对消费者产生依赖

生活寄邮件例子:

@寄件人(生产者)

@邮筒(缓冲区)

@收件人(消费者)

寄件人如果不使用邮箱,ta必须得把信直接交给邮递员(某个方法),才能送到收件人,这就产生你和邮递员之间的依赖

2.1.2 解耦:生产者不需要和消费者直接打交道。

2.2 支持并发(concurrency)

2.2.1 缓冲区的优点:

对于生产者:生产者线程只需要往缓冲区里面放置数据,无需管消费者消费的情况。

对于消费者:消费者只需从缓冲区拿数据处理,无需管生产者生产的情况

2.3 解决忙闲不均,提高效率

对于消费者:当生产者生产数据缓慢时,缓冲区仍有数据,不影响消费者消费

对于生产者:消费者处理数据慢时,生产者仍然可以继续往缓冲区里面放置数据 。

三、应用场景

线程并发协作(也叫线程通信),通常用于生产者/消费者模式,情景如下:

共享资源:生产者和消费者共享同一个资源,并且生产者和消费者之间相互依赖,互为条件。

对于生产者:没有生产产品之前,消费者要进入等待状态。而生产了产品之后,又需要马上通知消费者消费。

对于消费者:在消费之后,要通知生产者已经消费结束,需要继续生产新产品以供消费。

分析不足:在生产者消费者问题中,仅有synchronized是不够的。

synchronized可阻止并发更新同一个共享资源,实现了同步;

synchronized不能用来实现不同线程之间的消息传递(通信)

实现需要的主要方法:

“架构设计”中,会大量使用这个模式。暂时作为了解

四、总结

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/75589.html

相关文章

  • Java 线程编程基础——Thread 类

    摘要:程序执行时,至少会有一个线程在运行,这个运行的线程被称为主线程。程序的终止是指除守护线程以外的线程全部终止。多线程程序由多个线程组成的程序称为多线程程序。线程休眠期间可以被中断,中断将会抛出异常。 线程 我们在阅读程序时,表面看来是在跟踪程序的处理流程,实际上跟踪的是线程的执行。 单线程程序 在单线程程序中,在某个时间点执行的处理只有一个。 Java 程序执行时,至少会有一个线程在运行...

    zhoutk 评论0 收藏0
  • 并发编程中级篇三----并行设计模式----产者-费者模式

    摘要:生产者消费者模式是一个经典的多线程设计模式,它为多线程的协作提供了良好的解决方案。生产者消费者模式中的内存缓冲区的主要功能是数据在多线程间的共享。 生产者-消费者模式是一个经典的多线程设计模式,它为多线程的协作提供了良好的解决方案。在生产者-消费者模式中,通常有两类线程,即若干个生产者线程和若干个消费者线程。生产者线程负责提交用户请求,消费者线程负责处理用户请求。生产者和消费者之间通过...

    Aldous 评论0 收藏0
  • 用Python线程实现产者费者模式

    摘要:在生产者与消费者之间的缓冲区称之为仓库。生产者负责往仓库运输商品,而消费者负责从仓库里取出商品,这就构成了生产者消费者模式。中的多线程编程在实现生产者消费者模式之前,我们先学习下中的多线程编程。 什么是生产者消费者模式 在软件开发的过程中,经常碰到这样的场景:某些模块负责生产数据,这些数据由其他模块来负责处理(此处的模块可能是:函数、线程、进程等)。产生数据的模块称为生产者,而处理数据...

    lastSeries 评论0 收藏0
  • Java并发编程笔记(二)

    摘要:本文探讨并发中的其它问题线程安全可见性活跃性等等。当闭锁到达结束状态时,门打开并允许所有线程通过。在从返回时被叫醒时,线程被放入锁池,与其他线程竞争重新获得锁。 本文探讨Java并发中的其它问题:线程安全、可见性、活跃性等等。 在行文之前,我想先推荐以下两份资料,质量很高:极客学院-Java并发编程读书笔记-《Java并发编程实战》 线程安全 《Java并发编程实战》中提到了太多的术语...

    NickZhou 评论0 收藏0

发表评论

0条评论

qianfeng

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<