Implementación de cola concurrente en Java

Muhammad Zeeshan 12 octubre 2023
  1. Colas concurrentes en Java
  2. Mejor cola para implementar en Java
Implementación de cola concurrente en Java

Este artículo discutirá algunas de las implementaciones más efectivas de colas simultáneas en Java y cuáles deben utilizarse.

Colas concurrentes en Java

Primero, analicemos las tres colas.

Java Cola Enlazada Concurrente

No se ha incorporado ninguna función de bloqueo en ConcurrentLinkedQueue. Como resultado directo de esto, proporciona una técnica sin esperas en la que se garantiza que tanto agregar como sondear son seguros para subprocesos y regresan rápidamente.

Si nuestro cliente termina esperando en un bucle eterno, independientemente de la opción que elijamos, deberemos elegir una cola de bloqueo como la mejor alternativa. Además, el método sin espera se puede usar sin bloquear otros subprocesos.

Se está utilizando CAS o Compare-And-Swap en lugar de bloqueos en esta cola. Es una excelente opción para los sistemas reactivos modernos, ya que estos sistemas no permiten el uso de estructuras de datos de bloqueo y ganarían mucho con el uso de este método.

Java ArrayBlockingQueue

Internamente, esta cola hace uso de una matriz. El resultado es una cola limitada cuyo tamaño está predeterminado.

Las operaciones put y take en ArrayBlockingQueue comparten el mismo bloqueo. El impacto en el rendimiento merece la seguridad de que no se sobrescribirá ninguna entrada.

Específicamente, la cola asigna previamente la matriz antes de que se use. Si bien esto podría aumentar en todo momento, también podría usar demasiada memoria.

Uno de esos usos es una cola de tareas simple. Es común tener mucho personal para completar un pequeño número de clientes en esta situación.

Dado que el tamaño de esta cola está limitado, proporciona una zona de búfer en caso de limitaciones de memoria. Un ejemplo es la posibilidad de un largo período durante el cual una cola de gran capacidad permanece vacía.

La política de imparcialidad significa que la implementación del bloqueo mantendrá razonablemente el orden de los subprocesos. Si el subproceso A ingresa primero a la fase de adquisición de bloqueo y el subproceso B ingresa, el subproceso A obtendrá el bloqueo.

Sin justicia, el resultado no está claro. Es probable que se programe después del siguiente hilo.

Java LinkedBlockingQueue

Cada elemento en LinkedBlockingQueue está representado por un nuevo nodo en la variación de LinkedList utilizada por la cola.

El rendimiento de LinkedBlockingQueue varía significativamente de una ejecución a otra. Es decir; debemos perfilar constantemente nuestras circunstancias para garantizar que estamos utilizando la estructura de datos más adecuada.

Mejor cola para implementar en Java

Cada vez que se agrega o retira un elemento de la cola, LinkedBlockingQueue debe realizar una asignación y desasignación de nodos. Por lo tanto, un ArrayBlockingQueue puede ser preferible si la cola aumenta y disminuye rápidamente.

El tamaño de un ArrayBlockingQueue es siempre el mismo. Agregar el undécimo elemento con una capacidad de 10 hará que la instrucción insertar se detenga hasta que un subproceso existente elimine un elemento.

Cuando muchos subprocesos intentan agregar y eliminar elementos de la cola simultáneamente, cuando la cola no está disponible, esto genera un problema de equidad. El primer subproceso en solicitar algo es siempre el primero en obtenerlo, gracias a un mecanismo de equidad.

Sin esto, el tiempo de espera de un subproceso podría ser mucho más largo que el tiempo de espera de otro, lo que provocaría un comportamiento inesperado. Pero la carga de gestionar la equidad reducirá el rendimiento.

Sin embargo, la elección depende de si necesita o no el bloqueo. Suena como una situación en la que hay muchos proveedores pero solo un comprador.

Cuando hay muchos consumidores pero solo un productor, el comportamiento de bloqueo puede no ser necesario. En estos casos, los consumidores pueden comprobar si la cola está vacía y proceder en caso afirmativo.

Implementación de ArrayBlockingQueue en Java

La implementación ArrayBlockingQueue utiliza la técnica de doble condición single-lock. Su constructor uno tiene estructuras de datos subyacentes, Array y LinkedList, respectivamente.

El siguiente es el constructor de ArrayBlockingQueue:

public ArrayBlockingQueue(int capacity, boolean fair) {
  if (capacity < = 0)
    throw new IllegalArgumentException();
  this.items = new Object[capacity];
  lock = new ReentrantLock(fair);
  notEmpty = lock.newCondition();
  notFull = lock.newCondition();
}
Muhammad Zeeshan avatar Muhammad Zeeshan avatar

I have been working as a Flutter app developer for a year now. Firebase and SQLite have been crucial in the development of my android apps. I have experience with C#, Windows Form Based C#, C, Java, PHP on WampServer, and HTML/CSS on MYSQL, and I have authored articles on their theory and issue solving. I'm a senior in an undergraduate program for a bachelor's degree in Information Technology.

LinkedIn

Artículo relacionado - Java Queue