(第9天)每日源码调试之旅--生产者与消费者模型实现

今天开始调试同事实现的三种生产者与消费者模型,三个实现是逐步优化而来的。三个实现代码全部调试完毕后会发步在github上。项目代码:https://github.com/zxc1210449483/producer_consumer

废话不多说,开始调试:

断点打在main方法里面,进入main方法:

首先新建一个存储产品的pList,类似于一个产品仓库,接着传入pList初始化生产者消费者实例,然后开启生产者线程,进入run方法:

首先获取产品仓库product_list的锁,Synchronized同步锁保证一次只能有一个线程对仓库的产品数量进行修改,保证线程操作的安全性。接着判断仓库是否已满,满了的话就在product_list上调用wait()方法,让当前线程释放product_list的锁,等待被唤醒。为什么是product_list调用wait方法呢?因为当前线程之前已拥有该product_list的锁,wait()不仅仅是暂停当前线程,不让其继续生产产品,还能够让当前线程释放product_list的锁,以便消费者线程能够获取product_list的锁来对product_list里的产品进行消耗,一举两得。那如果仓库未满,就要进行产品的生产,并将产品放入仓库product_list,之后调用product_list.notifyAll()方法,及时通知可能处于wait状态的消费者消费产品。随后的当前线程休眠0.5s是为了模拟生产产品过程中的耗时,同时也是为了避免程序执行过快。

看完生产者的run方法,继续看看消费者的run方法:

消费者在消费之前也要获取product_list的锁以便能从仓库中取出产品,获得锁后先判断仓库中有没有产品,没有就需要让当前消费者线程等待,让出product_list的锁给其他生产者生产商品,如果仓库有产品就从中取出产品,然后唤醒其他可能处于wait状态的生产者线程,让其进行生产。随后线程休眠0.5s,模拟消费活动。

这种生产者与消费者模型的实现使用了同步机制,保证了线程安全,但Synchronized为阻塞型同步机制,即同一时间只能有一个线程在工作。所以生产者生产产品时,消费者不能消费,消费者消费时,生产者也不能进行生产,完全没有发挥多线程的并行优势提升运行效率,这并不是一个很好的实现,需要进行优化,今天先暂停,明天来看看它的优化方案。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值