Así que cavar a través de las entrañas de la fuente de Java 6 (omitir la parte entre las normas horizontales si no se preocupan por encontrar el código actual responsable de estas cosas)
La clase
java.util.concurrent.LinkedBlockingQueue
implementa usando mutex instancias de
java.util.concurrent.locks.ReentrantLock
.
A su vez, las variables de sincronización se generan usando java.util.concurrent.locks.ReentrantLock.newCondition()
que llama a java.util.concurrent.locks.ReentrantLock$Sync.newCondition()
.
El método java.util.concurrent.locks.ReentrantLock$Sync.newCondition()
devuelve una instancia de java.util.concurrent.AbstractQueuedSynchronizer$ConditionObject
que implementa las llamadas normales variables de sincronización a await()
, signal()
y signalAll()
descritos por la interfaz java.util.concurrent.locks.Condiion
.
Mirando el código fuente de la clase ConditionObject
, mantiene dos miembros llamados firstWaiter
y lastWaiter
que son los primeros y últimos nodos en una cola de bloqueo CLH (instancias de java.util.concurrent.locks.AbstractQueuedSynchronizer$Node
).
La documentación en la que los estados de clase:
Un hilo puede tratar de adquirir si es primero en la cola. Pero ser el primero no garantiza el éxito; solo da derecho a contender. Por lo tanto, es probable que el hilo contendiente lanzado actualmente deba volver a esperar.
Así que creo que la respuesta es que el método take()
en LinkedBlockingQueue
intentos de dar un trato preferencial a aquellos hilo que llama take()
anterior. Le dará al primer hilo para llamar al take()
la primera oportunidad de agarrar un artículo de la cola cuando esté disponible, pero debido a tiempos de espera, interrupciones, etc. que el hilo no se garantiza ser el primer hilo para sacar el elemento de la cola.
Tenga en cuenta que esto es completamente específico para esta implementación en particular. En general, debe suponer que las llamadas al take()
activarán un hilo de espera aleatorio cuando un elemento de la cola esté disponible y no necesariamente el primero que llamó al take()
.