所以通過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()
的線程。