生产者消费者问题:为什么多个消费者只有一个参与消费?

ID:16970 / 打印

生产者消费者问题:为什么多个消费者只有一个参与消费?

生产者消费者问题:多个消费者中只有一个参与消费

在生产者消费者模式中,尽管存在多个消费者线程,但程序中仅有一个消费者参与消费,违背了预期。

问题原因

此问题根源在于 wait() 和 notifyall() 方法的机制。只有持有锁才能调用 wait() 方法,而 notifyall() 只能唤醒由该锁调用 wait() 方法而处于等待状态的线程。

程序执行流程

  1. 生产者线程获取锁,生产资源并唤醒所有等待线程。
  2. 多个消费者线程竞争锁,假设消费者 1 首先获取锁。
  3. 消费者 1 消费资源并唤醒所有等待线程,但尚未释放锁。
  4. 生产者线程被唤醒,但由于判断资源数量大于 0,再次进入等待状态。
  5. 消费者 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();             }         }     } }
上一篇: Java 集群中如何保证定时器仅在一台服务器上运行?
下一篇: Java 中的 System.exit(2) 究竟意味着什么?

作者:admin @ 24资源网   2024-11-27

本站所有软件、源码、文章均有网友提供,如有侵权联系308410122@qq.com

与本文相关文章

发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。