所以通过Java 6源的深处挖掘(跳过水平线之间的部分,如果你不关心找到负责这个东西实际的代码)
类
java.util.concurrent.LinkedBlockingQueue
使用实现互斥
java.util.concurrent.locks.ReentrantLock
的实例。
接着,使用java.util.concurrent.locks.ReentrantLock.newCondition()
生成同步变量,其调用java.util.concurrent.locks.ReentrantLock$Sync.newCondition()
。
java.util.concurrent.locks.ReentrantLock$Sync.newCondition()
返回java.util.concurrent.AbstractQueuedSynchronizer$ConditionObject
一个实例,其实现由接口java.util.concurrent.locks.Condiion
所述的正常同步变量调用await()
,signal()
signalAll()
和方法。
寻找在用于ConditionObject
类的源代码,它使两个构件称为firstWaiter
和lastWaiter
是在CLH锁定队列中第一个和最后节点(的java.util.concurrent.locks.AbstractQueuedSynchronizer$Node
实例)。
在该类状态的文档:
线程可能会尝试收购,如果它是第一个在队列中。但首先并不能保证成功;它只会给予抗争的权利。所以当前发布的竞争者线程可能需要重新等待。
所以我相信这里的答案是,在LinkedBlockingQueue
企图take()
方法优待那些所谓take()
较早线程。它会给第一个线程呼叫take()
第一次获取队列项目的机会,但是由于超时,中断等原因不能保证成为第一个从项目中获取项目的线程队列。
请记住,这是完全特定于此特定实施。一般来说,假设在take()
的调用将唤醒一个随机等待线程,当一个队列项目变得可用时,不一定是第一个调用take()
的线程。