Herramienta de programación concurrente de Java JUC Parte 4: Cola de lista vinculada LinkedBlockingQueue

En el artículo anterior, presenté las herramientas de programación concurrente de Java: interfaz BlockingQueue, ArrayBlockingQueue, DelayQueue.

La cola LinkedBlockingQueue es la clase de implementación de la interfaz BlockingQueue, por lo que tiene todas las características de la interfaz BlockingQueue. LinkedBlockingQueue pone en cola los elementos de una manera primero en entrar, primero en salir (FIFO). LinkeBlockingQueue proporciona dos constructores: un constructor construye una cola con un número fijo de colas y el otro constructor sin parámetros construye una cola con una capacidad de cola Integer.MAX_VALUE.

public LinkedBlockingQueue() {
    this(Integer.MAX_VALUE);
}

public LinkedBlockingQueue(int capacity) {
    if (capacity <= 0) throw new IllegalArgumentException();
    this.capacity = capacity;
    last = head = new Node<E>(null);
}

Comparación de ArrayBlockingQueue y LinkedBlockingQueue

ArrayBlockingQueue y LinkedBlockingQueue implementan la interfaz BlockingQueue, por lo que son consistentes en su uso. No presentaremos el uso a continuación, sino que procederemos desde la perspectiva del rendimiento de los dos y la implementación de la estructura de datos subyacente.

  • ArrayBlockingQueue inserta y elimina datos, usando solo un bloqueo, y las operaciones de lectura y escritura no pueden ser paralelas. Por lo tanto, la eficiencia de ejecución en escenarios de alta concurrencia será más lenta que LinkedBlockingQueue.

  • LinkedBlockingQueue utiliza una variante de algoritmo de "dos colas de bloqueo", bloqueos dobles (ReentrantLock): takeLock, putLock, que permite la lectura y escritura paralelas, remove (e) y los iteradores necesitan adquirir 2 bloqueos. Esto puede reducir la posibilidad de que el subproceso entre en el estado de ESPERA porque el subproceso no puede obtener el bloqueo, mejorando así la eficiencia de la ejecución concurrente del subproceso.

  • El código subyacente de ArrayBlockingQueue se implementa mediante una matriz. Al crear, debe especificar la capacidad de la cola y asignar espacio de almacenamiento; LinkedBlockingQueue se implementa mediante una estructura de datos de lista vinculada, y la asignación de espacio de almacenamiento de sus nodos de lista vinculada es dinámica, y se agregan nuevos objetos de elemento a la cola para su asignación Espacio, espacio de almacenamiento GC después de que el objeto de elemento se saca de la cola, la capacidad máxima de la cola se especifica durante la inicialización. Sin embargo, el uso de la estructura de datos de listas vinculadas es tanto la ventaja como la desventaja de LinkedBlockingQueue En escenarios de alta concurrencia, la JVM de Java debe recolectarse basura con frecuencia debido a la asignación dinámica de espacio.

En términos generales, en un escenario concurrente, el rendimiento de LinkedBlockingQueue es mejor que el de ArrayBlockingQueue. Pero la primera opción para implementar colas de alto rendimiento en Java es el disruptor, que no está incluido en el JDK. El rendimiento subyacente de Log4j2, con el que los programadores de Java están muy familiarizados, se ha mejorado considerablemente en comparación con logback y log4j. La razón es que se utiliza el registro asíncrono implementado por la cola de alto rendimiento del disruptor.

Bienvenido a seguir mi blog, hay muchas colecciones boutique.

  • Este artículo se reproduce con una indicación de la fuente (se debe adjuntar la conexión y el texto no se puede reproducir únicamente): Blog de Letter Brother .

Si crees que es útil para ti, ¡dale me gusta y compártelo! ¡Tu apoyo es mi inagotable motivación creativa! . Además, el autor ha publicado el siguiente contenido de alta calidad recientemente y espero su atención.

Supongo que te gusta

Origin blog.csdn.net/hanxiaotongtong/article/details/115192401
Recomendado
Clasificación