linkedblockingqueue ejemplo arrayblockingqueue java multithreading concurrency blockingqueue

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:

  1. Quieres una lectura y escritura eficiente.
  2. 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.