arrayblockingqueue - blockingqueue java 8
Cuál es la diferencia entre ArrayBlockingQueue y LinkedBlockingQueue (4)
Se supone que agregar un elemento a ArrayBlockingQueue es más rápido, ya que significa solo establecer una referencia a un elemento de la matriz Object de respaldo, mientras que agregar un elemento a LinkedBlockingQueue significa crear un nodo y establecer su elemento, prev y los siguientes campos. Además, cuando eliminamos un elemento de LinkedBlockingQueue, el Nodo eliminado se convierte en basura que puede influir en el rendimiento de la aplicación.
En cuanto al consumo de memoria, ArrayBlockingQueue siempre contiene una matriz de objetos con capacidad total, incluso cuando está vacía. Por otro lado, un elemento en LinkedBlockingQueue es un nodo con un objeto con 3 campos de objeto.
- ¿En qué escenarios es mejor usar un ArrayBlockingQueue y cuándo es mejor usar un LinkedBlockingQueue?
- Si la capacidad predeterminada de LinkedBlockingQueue es igual a MAX Integer, ¿es realmente útil usarlo como BlockingQueue con la capacidad predeterminada?
ArrayBlockingQueue<E>
y LinkedBlockingQueue<E>
son implementaciones comunes de la interfaz BlockingQueue<E>
.
ArrayBlockingQueue
está respaldado por una array
y Queue
impone órdenes como FIFO
. el jefe de la cola es el elemento más antiguo en términos de tiempo y la cola de la cola es el elemento más joven. ArrayBlockingQueue
también es un buffer de tamaño fijo limitado. Por otro lado LinkedBlockingQueue
es una cola opcionalmente limitada construida sobre los nodos de Linked.
El argumento de constructor de límite de capacidad opcional sirve para evitar la expansión excesiva de la cola porque si la capacidad no está especificada, entonces es igual a Integer.MAX_VALUE
.
Lea más desde here .
Punto de referencia: http://www.javacodegeeks.com/2010/09/java-best-practices-queue-battle-and.html
ArrayBlockingQueue
está respaldado por una matriz cuyo tamaño nunca cambiará después de la creación. Establecer la capacidad en Integer.MAX_VALUE
crearía una gran matriz con altos costos en el espacio. ArrayBlockingQueue
siempre está limitado.
LinkedBlockingQueue
crea nodos dinámicamente hasta que se alcanza la capacity
. Esto es por defecto Integer.MAX_VALUE
. Usar una capacidad tan grande no tiene costos adicionales en el espacio. LinkedBlockingQueue
está opcionalmente limitado.
ArrayBlockingQueue :
ArrayBlockingQueue es una cola de bloqueo delimitada que almacena los elementos internamente en una matriz. Que esté limitado significa que no puede almacenar cantidades ilimitadas de elementos. Hay un límite superior en la cantidad de elementos que puede almacenar al mismo tiempo. Establece el límite superior en el momento de la instanciación, y después de eso no se puede cambiar.
LinkedBlockingQueue
LinkedBlockingQueue mantiene los elementos internamente en una estructura vinculada (nodos vinculados). Esta estructura enlazada puede tener opcionalmente un límite superior si se desea. Si no se especifica ningún límite superior, Integer.MAX_VALUE se utiliza como límite superior.
Semejanza
ArrayBlockingQueue / LinkedBlockingQueue almacena los elementos internamente en orden FIFO (Primero en entrar, Primero en salir). El encabezado de la cola es el elemento que ha estado en cola el tiempo más largo, y la cola de la cola es el elemento que ha estado en la cola el tiempo más corto.
Diferencias
- LinkedBlockingQueue tiene un putLock y un takeLock para insertar y eliminar, respectivamente, pero ArrayBlockingQueue usa solo 1 bloqueo.
- ArrayBlockingQueue utiliza el algoritmo de condición doble de bloqueo simple y LinkedBlockingQueue es una variante del algoritmo de "dos cola de bloqueo" y tiene 2 condiciones de 2 bloqueos (takeLock, putLock).
La implementación de LinkedBlockingQueue utiliza dos algoritmos de bloqueo de colas. Por lo tanto, la toma y puesta en espera de LinkedBlockingQueue puede funcionar al mismo tiempo, pero este no es el caso con ArrayBlockingQueue. La razón para usar un solo bloqueo en ArrayBlockingQueue es que ArrayBlockingQueue debe evitar sobrescribir las entradas para que sepa dónde están el inicio y el final. Un LinkedBlockQueue no necesita saber esto, ya que le permite al GC preocuparse por limpiar los Nodos en la cola.