Red de conocimiento de abogados - Derecho de sociedades - ¿Cuál es la diferencia entre cola con bloqueo, cola sin bloqueo y cola normal en Java?

¿Cuál es la diferencia entre cola con bloqueo, cola sin bloqueo y cola normal en Java?

La diferencia entre una cola de bloqueo y una cola ordinaria es que cuando la cola está vacía, se bloqueará la operación de obtener elementos de la cola, o cuando la cola está llena, la operación de agregar elementos a la cola será bloqueada. Un hilo que intenta obtener un elemento de una cola de bloqueo vacía será bloqueado hasta que otro hilo inserte un nuevo elemento en la cola vacía. De manera similar, un hilo que intenta agregar un nuevo elemento a una cola de bloqueo completo también será bloqueado hasta que otro hilo libere la cola nuevamente, como eliminar uno o más elementos de la cola o borrar la cola por completo.

1.ArrayDeque, (cola de doble extremo de matriz)

2.PriorityQueue, (cola prioritaria)

3.ConcurrentLinkedQueue, (cola concurrente basada en lista vinculada)

4.DelayQueue, (cola de bloqueo retrasado) (la cola de bloqueo implementa la interfaz BlockingQueue)

5.ArrayBlockingQueue, (cola de bloqueo concurrente basada en matrices)

6. LinkedBlockingQueue, (cola de bloqueo FIFO basada en lista vinculada)

7.LinkedBlockingDeque, (cola de bloqueo FIFO de doble extremo basada en lista vinculada)

8.PriorityBlockingQueue, (con prioridad Bloqueo ilimitado cola)

9. SynchronousQueue (cola de bloqueo sincrónico concurrente)

Cola de bloqueo y modo productor-consumidor

La cola de bloqueo (cola de bloqueo) proporciona operaciones de venta y recepción bloqueables. Se introducen métodos que equivalen a una oferta y una encuesta cronometradas. Si la cola está llena, el método put se bloqueará hasta que haya espacio disponible; si la cola está vacía, el método take se bloqueará hasta que haya un elemento disponible. La longitud de la cola puede ser limitada o ilimitada; una cola infinita nunca estará llena, por lo que su método put nunca se bloqueará.

Las colas de bloqueo admiten el patrón de diseño productor-consumidor. Un diseño productor-consumidor separa los "productos producidos" de los "productos consumidos". Este modelo no encuentra un trabajo y lo procesa inmediatamente, sino que lo coloca en una lista de tareas ("por hacer") para su posterior procesamiento. El patrón productor-consumidor simplifica el desarrollo porque elimina la interdependencia entre el código de productor y consumidor. Los productores y consumidores producen y consumen datos a ritmos diferentes o cambiantes. El modelo productor-consumidor desacopla estas actividades, simplificando así la gestión de la carga de trabajo.

El diseño productor-consumidor gira en torno al bloqueo de colas. El productor coloca datos en la cola y los pone a disposición, y el consumidor obtiene los datos de la cola cuando está listo para el comportamiento apropiado. Los productores no necesitan conocer la provincia o el número de consumidores, ni siquiera tener consumidores; solo son responsables de poner los datos en la cola. De manera similar, los consumidores no necesitan saber quiénes son los productores y quién les asignó el trabajo. BlockingQueue puede utilizar cualquier número de productores y consumidores, simplificando la implementación de diseños de productor-consumidor. El diseño productor-consumidor más común combina un grupo de subprocesos con una cola de trabajo.

Las colas de bloqueo simplifican la codificación del consumidor porque las tomas permanecerán bloqueadas hasta que aparezcan los datos disponibles. Si el productor no puede producir trabajo lo suficientemente rápido como para mantener ocupado al consumidor, entonces éste no tiene más opción que esperar hasta que haya trabajo que hacer. Al mismo tiempo, la función de bloqueo del método put también simplifica enormemente la codificación del productor. Si se utiliza una cola limitada, cuando la cola esté llena, el productor bloqueará y no podrá generar más trabajo temporalmente, lo que le dará al consumidor. tiempo Ven a ponerte al día.

Las colas limitadas son poderosas herramientas de administración de recursos que se utilizan para crear aplicaciones confiables: contienen actividades amenazantes que pueden generar demasiado trabajo, lo que hace que su aplicación sea vulnerable a la sobrecarga. Sea más fuerte en el trabajo.

Aunque el modelo productor-consumidor puede desacoplar los códigos de productor y consumidor entre sí, sus comportamientos todavía están acoplados indirectamente a través de la cola de intercambio

La biblioteca de clases contiene algunas implementaciones de BlockingQueue, entre las cuales LinkedBlockingQueue y ArrayBlockingQueue son colas FIFO, similares a LinkedList y ArrayList, pero tienen un mejor rendimiento de concurrencia que la Lista sincronizada. PriorityBlockingQueue es una cola ordenada por prioridad. Esta PriorityBolckingQueue es muy útil cuando no desea procesar elementos según los atributos FIFO. Al igual que con otros contenedores ordenados, PriorityBlockingQueue puede comparar los elementos en su orden natural (si implementan Comparable), o pueden ordenarse usando un Comparador.

La última implementación de BlockingQueue es SynchronousQueue, que no es una cola real en absoluto porque no mantiene ningún espacio de almacenamiento para los elementos de la cola. Sin embargo, mantiene una lista de subprocesos en cola esperando para poner o quitar elementos de la cola. Debido a que SynchronousQueue no tiene capacidad de almacenamiento, put y take se bloquearán a menos que otro subproceso esté listo para participar en la transferencia. Las colas como SynchronousQueue solo son adecuadas cuando hay suficientes consumidores y siempre están listos para la siguiente tarea.

Algoritmo sin bloqueo

El algoritmo basado en bloqueo traerá algunos riesgos de fallo de vida. Si un subproceso se retrasa debido a un bloqueo de E/S, errores de página u otros motivos mientras se mantiene el bloqueo, es probable que todos los subprocesos no puedan avanzar.

La falla o suspensión de un subproceso no debería afectar la falla o suspensión de otros subprocesos. Dicho algoritmo se convierte en un algoritmo sin bloqueo; si algunos subprocesos pueden continuar ejecutándose en cada paso del algoritmo, entonces dicho algoritmo. El algoritmo se llama algoritmo sin bloqueo. Al utilizar CAS para la coordinación entre subprocesos, dicho algoritmo, si se construye correctamente, no bloquea ni bloquea. El CAS que no compite siempre tiene éxito. Si varios subprocesos compiten con un CAS, uno siempre ganará y avanzará. Los algoritmos sin bloqueo son "inmunes" al interbloqueo del montón y a la inversión de prioridad (pero pueden sufrir inanición y bloqueo activo porque permiten la reentrada).

Los algoritmos sin bloqueo reemplazan los bloqueos mediante el uso de primitivas de concurrencia de bajo nivel, como comparación e intercambio. La clase de variable atómica proporciona estas primitivas de bajo nivel a los usuarios y también se puede utilizar como "mejores variables volátiles". También proporciona operaciones de actualización atómica para clases enteras y referencias de objetos.