Java LinkedBlockingQueue';在生产者-消费者场景中,使用多个生产者实现线程安全

Java LinkedBlockingQueue';在生产者-消费者场景中,使用多个生产者实现线程安全,java,concurrency,race-condition,producer-consumer,blockingqueue,Java,Concurrency,Race Condition,Producer Consumer,Blockingqueue,我试图在Java中模拟一种情况,其中许多生产者(至少2个)以固定速率访问同一LinkedBlockingQueue。他们生产,投入,然后重新开始。 我想知道这是否会最终导致那些试图同时获得队列写访问权的生产者之间的竞争条件。java.util.concurrent.BlockingQueue的实现是否已经设置为处理这样的问题,或者我是否应该手动创建互斥以避免此类问题 感谢您的关注。java的阻塞队列对于单个操作(如take和put)是线程安全的,但是对于put或take操作(如addAll)的多

我试图在Java中模拟一种情况,其中许多生产者(至少2个)以固定速率访问同一LinkedBlockingQueue。他们生产,投入,然后重新开始。 我想知道这是否会最终导致那些试图同时获得队列写访问权的生产者之间的竞争条件。java.util.concurrent.BlockingQueue的实现是否已经设置为处理这样的问题,或者我是否应该手动创建互斥以避免此类问题


感谢您的关注。

java的阻塞队列对于单个操作(如take和put)是线程安全的,但是对于put或take操作(如addAll)的多个操作(如未以原子方式执行)则不是线程安全的


因此,在您的情况下,答案是否定的,您不应该自己处理线程安全问题,除非您希望生产商生产多个产品并将它们全部放在一个操作中

所有BlockingQueue都是线程安全的。“请注意,BlockingQueue可以安全地用于多个生产者和多个消费者。”感谢您的回复。在访问单个操作的阻塞队列时,默认情况下是否也提供了饥饿避免机制?对于您的情况可能没有帮助,但ArrayBlockingQueue具有可在构造函数中设置的公平性标志。这保证了阻塞操作以FIFO顺序进行服务,这可以防止饥饿。