
生产者消费者问题:多个消费者中只有一个参与消费
在生产者消费者模式中,尽管存在多个消费者线程,但程序中仅有一个消费者参与消费,违背了预期。
问题原因
此问题根源在于 wait() 和 notifyall() 方法的机制。只有持有锁才能调用 wait() 方法,而 notifyall() 只能唤醒由该锁调用 wait() 方法而处于等待状态的线程。
程序执行流程
歌者PPT
歌者PPT,AI 写 PPT 永久免费
197 查看详情
生产者线程获取锁,生产资源并唤醒所有等待线程。多个消费者线程竞争锁,假设消费者 1 首先获取锁。消费者 1 消费资源并唤醒所有等待线程,但尚未释放锁。生产者线程被唤醒,但由于判断资源数量大于 0,再次进入等待状态。消费者 1 持续持有锁,没有机会让其他消费者参与消费。
解决方案
为了让所有消费者都有机会参与消费,需要修改程序逻辑,确保在消费者线程释放锁之前,唤醒所有等待线程。
修改后的代码如下:
class ConThread extends Thread { private List list; public ConThread(List list) { this.list = list; } @Override public void run() { while (true) { synchronized (list) { if (list.size() == 0) { try { list.wait(); } catch (InterruptedException e) { e.printStackTrace(); } } Object object = list.remove(0); System.out.println(Thread.currentThread().getName() + "消费 list" + object); // 释放锁后再唤醒所有等待线程 list.notifyAll(); } } }}
以上就是生产者消费者问题:为什么多个消费者只有一个参与消费?的详细内容,更多请关注创想鸟其它相关文章!
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/421157.html
微信扫一扫
支付宝扫一扫