arrayblockingqueue - blockingqueue java ejemplo
¿Cuándo preferir LinkedBlockingQueue sobre ArrayBlockingQueue? (3)
¿Cuándo preferir LinkedBlockingQueue
sobre ArrayBlockingQueue
?
Qué estructura de datos usar entre LinkedBlockingQueue
y ArrayBlockingQueue
cuando:
- Quieres una lectura y escritura eficiente.
- debe tener menos huellas de memoria
Aunque hay una pregunta similar, pero no resalta el hecho de que se debería preferir?
Campo de golf:
Ambos implementan BlockingQueue
. Como su nombre lo indica, arrayBlockingQueue
está respaldado por Array
mientras que LinkedBlockingQueue
está respaldado por una linked list
.
Cuál elegir esencialmente debería ser el mismo que el motivo para elegir entre un ArrayList
y un LinkedList
Se supone que agregar un elemento a ArrayBlockingQueue
es más rápido, ya que solo significa establecer una referencia a un elemento de la matriz de objetos de respaldo, mientras que agregar un elemento a LinkedBlockingQueue
significa crear un Node
y configurar su elemento, los campos prev
y next
. Además, cuando eliminamos un elemento de LinkedBlockingQueue
el nodo eliminado se convierte en basura, lo que puede influir en el rendimiento de la aplicación.
Boris, la araña, ya ha descrito la diferencia más visible entre ArrayBlockingQueue
y LinkedBlockingQueue
: la primera siempre está limitada, mientras que la última puede ser ilimitada.
Entonces, en caso de que necesite una cola de bloqueo ilimitada, LinkedBlockingQueue
o LinkedTransferQueue
usa como BlockingQueue
son sus mejores opciones en la caja de herramientas java.util.concurrent
.
Pero digamos que necesitas una cola de bloqueo limitada. Al final, debe elegir una implementación basada en una amplia experimentación con una simulación de su carga de trabajo del mundo real. Sin embargo, aquí hay algunas notas que pueden ayudarlo con su elección o con la interpretación de los resultados del experimento:
-
ArrayBlockingQueue
se puede crear con una política de equidad de programación configurable (on / off). Esto es excelente si necesita imparcialidad o si desea evitar la inanición del productor / consumidor, pero le costará mucho rendimiento. -
ArrayBlockingQueue
preasigna su matriz de respaldo, por lo que no asigna nodos durante su uso, pero toma inmediatamente lo que puede ser una parte considerable de la memoria, lo que puede ser un problema si la memoria está fragmentada. -
ArrayBlockingQueue
debería tener menos variabilidad en el rendimiento, ya que tiene menos partes móviles en general, utiliza un algoritmo de bloqueo único más simple y menos sofisticado, no crea nodos durante el uso y su comportamiento de caché debe ser bastante consistente. -
LinkedBlockingQueue
debería tener un mejor rendimiento, ya que utiliza bloqueos separados para la cabeza y la cola. -
LinkedBlockingQueue
no asigna previamente los nodos, lo que significa que su huella de memoria coincidirá aproximadamente con su tamaño, pero también significa que incurrirá en algún trabajo para la asignación y liberación de nodos. -
LinkedBlockingQueue
probablemente tendrá un peor comportamiento de caché, lo que puede afectar su propio rendimiento, pero también el rendimiento de otros componentes debido a la falsa compartición.
Dependiendo de su caso de uso y de cuánto le interese el rendimiento, es posible que también quiera mirar fuera de java.util.concurrent
y considerar Disruptor (un búfer de anillo no bloqueante acotado excepcionalmente rápido pero algo especializado) o JCTools (un variedad de colas acotadas o ilimitadas con diferentes garantías dependiendo del número de productores y consumidores).
Desde el ArrayBlockingQueue
para ArrayBlockingQueue
Una cola de bloqueo limitada respaldada por una matriz.
Énfasis mio
Desde el LinkedBlockingQueue
para LinkedBlockingQueue
:
Una cola de bloqueo limitada de forma opcional basada en nodos vinculados.
Énfasis mio
Por lo tanto, si necesita una cola limitada , puede usar cualquiera de las dos, si necesita una cola ilimitada , debe usar LinkedBlockingQueue
.
Para una cola limitada , entonces necesitaría un punto de referencia para determinar cuál es mejor.