Esta pregunta merece una mejor respuesta.
Java ConcurrentLinkedQueue
se basa en el famoso algoritmo de Maged M. Michael y Michael L. Scott para colas sin bloqueo sin bloqueo .
"Sin bloqueo" como término aquí para un recurso en disputa (nuestra cola) significa que independientemente de lo que haga el programador de la plataforma, como interrumpir un hilo, o si el hilo en cuestión es simplemente demasiado lento, otros hilos compiten por el mismo recurso todavía podrá progresar. Si hay un bloqueo involucrado, por ejemplo, el hilo que sostiene el bloqueo podría interrumpirse y todos los hilos que esperan ese bloqueo se bloquearían. Los bloqueos intrínsecos (la synchronized
palabra clave) en Java también pueden tener una penalización severa para el rendimiento, como cuando el bloqueo sesgadoestá involucrado y tiene contención, o después de que la máquina virtual decida "inflar" el bloqueo después de un período de gracia de giro y bloquear los subprocesos en conflicto ... por lo que en muchos contextos (escenarios de contención baja / media), comparar y Los conjuntos de referencias atómicas pueden ser mucho más eficientes y esto es exactamente lo que están haciendo muchas estructuras de datos sin bloqueo.
Java ConcurrentLinkedQueue
no solo no bloquea, sino que tiene la asombrosa propiedad de que el productor no compite con el consumidor. En un escenario de productor único / consumidor único (SPSC), esto realmente significa que no habrá disputas de las que hablar. En un escenario de productor múltiple / consumidor único, el consumidor no competirá con los productores. Esta cola tiene contención cuando varios productores lo intentan offer()
, pero eso es concurrencia por definición. Es básicamente una cola sin bloqueos de propósito general y eficiente.
En cuanto a que no sea un BlockingQueue
, bueno, bloquear un hilo para esperar en una cola es una forma terriblemente terrible de diseñar sistemas concurrentes. No lo hagas. Si no puede descubrir cómo usar un ConcurrentLinkedQueue
en un escenario de consumidor / productor, simplemente cambie a abstracciones de nivel superior, como un buen marco de actor.