生产者消费者问题:多个消费者中只有一个参与消费
在生产者消费者模式中,尽管存在多个消费者线程,但程序中仅有一个消费者参与消费,违背了预期。
问题原因
此问题根源在于 wait() 和 notifyall() 方法的机制。只有持有锁才能调用 wait() 方法,而 notifyall() 只能唤醒由该锁调用 wait() 方法而处于等待状态的线程。
程序执行流程
- 生产者线程获取锁,生产资源并唤醒所有等待线程。
- 多个消费者线程竞争锁,假设消费者 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(); } } } }
以上就是生产者消费者问题:为什么多个消费者只有一个参与消费?的详细内容,更多请关注php中文网其它相关文章!
版权声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系 yyfuon@163.com