对一个Producer使用受保护的块 - 许多Consumer应用程序

时间:2011-03-26 17:17:43

标签: java synchronization

在Java(tm)教程中关注this example之后,我实现了这个基本的生成器 - Delphi 2009中的一个消费者应用程序(引入了对象锁)。

现在我想扩展它,以便多个消费者线程从Drop实例接收消息。与Java教程示例相比,唯一的代码更改将在main方法中:

public class ProducerConsumerExample {
    public static void main(String[] args) {

        Drop drop = new Drop();

        (new Thread(new Producer(drop))).start();

        (new Thread(new Consumer(drop))).start();
        (new Thread(new Consumer(drop))).start(); // <--- added
        (new Thread(new Consumer(drop))).start(); // <--- added 
    }
}

因此Drop类仍然会有一个String类型的消息对象,所有正在运行的消费者将竞争访问锁,并处理消息数据。

此代码更改会引入风险,还是使用安全?

1 个答案:

答案 0 :(得分:0)

根据链接示例的代码,您将无法阻止多个消费者。 因此,您需要将stop()方法添加到消费者类,或者发布DONE消费者的次数。

除此之外,没有风险。

但是如果你希望提高生产者 - 消费者的吞吐量,你可以考虑使用当时可以容纳多个值的类 - 某种类型的队列,例如来自JDK的BlockingQueue。这样,您的生产者和消费者就不会像在此代码示例中那样经常被阻止。