深入多线程十四:经典生产者与消费者问题,本质是线程通信问题

在学习Java的道路上,是否路过多线程时总让你很迷惘;很不巧,我也是,而使我们感到很迷惘主要原因都源于没有对概念的深深的理解和实践。所以我决定漫步Java多线程,同你一起会会多线程。

深入多线程系列

深入多线程一:理解多线程在于深深地理解了多任务、进程、多线程、线程
深入多线程二:手撕多线程,从会三种创建多线程方式开始:除了常见的两种,你是否了解Callable接口方式?
深入多线程三:初遇并发问题:从一个小故事开始,从一行行代码开始
深入多线程四:停止多线程,你不会还以为是用stop和destroy吧?
深入多线程五:多线程为何要使用休眠?
深入多线程六:线程礼让与强制执行
深入多线程七:纯手绘图解多线程状态+代码示例,就问你怕了吗?
深入多线程八:多线程的优先级
深入多线程九:守护线程
深入多线程十:通过案例体会多线程的不安全
深入多线程十一: 超全synchronized的两种用法:同步方法与同步块
深入多线程十二:什么是死锁?
深入多线程十三:什么是Lock锁,比起synchronized锁有什么区别?
深入多线程十四:经典生产者与消费者问题,本质是线程通信问题
深入多线程十五:管程方式解决生产者与消费者问题
深入多线程十六:信号灯方式解决生产者与消费者问题
深入多线程十七:什么是池?线程池方式解决生产者与消费者问题

生产者和消费者是我们在多线程中最常见的经典问题,没实践过,想必也是有所耳闻的。

举个生产者和消费者栗子

可以理解成一个超市场景;超市需要有商品,生产者将商品投入超市,消费者去超市消费取商品。

如果超市没有商品,则生产者将商品投入超市,如果超市已经有商品,则停止投入商品并等待商品被消费者消费取走为止。

如果超市中放有商品,则消费者可以消费取走商品,如果超市没有商品,消费者停止消费并等待直到超市再次有商品投入为止。

在这里插入图片描述

分析

上面的栗子中可以看到,生产者和消费者 共享的是同一个资源 (超市),生产者和消费者之间相互依赖和互为条件,所以 这是一个线程同步问题。

在解决生产者消费者问题中,仅有我们之前系列所学的synchronized是不够的。虽然synchronized可以实现同步,阻止并发更新同一个共享资源,但是不能实现不同线程之间的通信。

所以Java提供了几个方法解决线程之间的通信问题

wait()让当前线程等待,直到其他线程通知,与sleep不同,有释放锁
notify()唤醒正在等待的线程
notifyAll()唤醒对象上所有调用wait方法线程,优先级高的线程优先调度

以上方法都只能是在同步方法或同步代码块中使用,不然会抛出lllegalMonitorStateException异常。

你会发现解决线程之间通信问题的三个方法,不仅在代码层面更加灵动,回到我们上面现实中超市的例子中也是更加丰富真实。

可爱的你:亲,你的文章呢?

一颗剽悍的种子:傻瓜,你点赞,关注了吗???

可爱的你:额…我这就去。

wait…

一颗剽悍的种子:好了,再告诉你。

notify…

一颗剽悍的种子:@可爱的你 h h 文章新鲜出炉啦!!!

在这里插入图片描述

最后:

经典生产者与消费者问题,本质是线程通信问题。

最后的最后,为了更好的阅读体验,我把想说的话都放在了下面,嘿嘿。

我是一颗剽悍的种子 把我会的,认真的分享 是我写博客一直不变的信条。
如果你能看到这篇博文,说明咱们还是很有缘的;希望能带给你一些许帮助,创作的不易,
把我文章的知识带走,你的三连留下,点赞,评论,关注,是我最大的动力。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值