Java:LinkedBlockingQueue是否考虑了消费者的顺序?

zer*_*lus 7 java concurrency

我有3个线程:2个消费者,ConsumerAConsumerB,和Producer.

我也有 LinkedBlockingQueue queue

在t = 1时:ConsumerA调用queue.take()

在t = 2时:ConsumerB调用queue.take()

在t = 3时:Producer调用queue.put(foo)

是否保证ConsumerA在ConsumerB之前收到foo?换句话说,消费者调用take()的顺序是每个通知的顺序?

如果没有,是否有替代数据结构将根据订单提供更高的优先级?

Chr*_*ett 4

从源代码来看,这是不能保证的。有一种受保护的块机制,可以随机唤醒一个线程,具体取决于调度程序的感受。

 notEmpty.signal(); // propagate to a non-interrupted thread
Run Code Online (Sandbox Code Playgroud)

完整代码:http://kickjava.com/src/java/util/concurrent/LinkedBlockingQueue.java.htm

编辑:刚刚再次查看了 ReenterantLock 和 Condition,线程显然是按 FIFO 顺序发出信号的。因此,第一个等待插入的线程将首先收到信号。然而,这些都是实施细节!不要依赖他们。

实现不需要为所有三种形式的等待定义完全相同的保证或语义,也不需要支持线程实际挂起的中断