Red de conocimiento informático - Aprendizaje de programación - Cola de bloqueo de enlaces

Cola de bloqueo de enlaces

LinkedBlockingDeque es estructuralmente diferente de la cola de bloqueo explicada anteriormente. No es una cola, sino una Deque, que es una cola de doble extremo.

LinkedBlockingDeque es segura para subprocesos. ilimitado, admite colas de doble extremo de primero en entrar, primero en salir y último en entrar, primero en salir, que se implementan en forma de listas vinculadas. LinkedBlockingDeque es una cola de bloqueo ilimitada de doble extremo segura para subprocesos que admite primero en entrar, primero en salir y último en entrar, primero en salir, implementada en forma de una lista vinculada. Puede revisar las características de la cola de bloqueo LinkedBlockingQueue anterior. Son similares en naturaleza, pero algo diferentes:

La relación entre Queue y Deque es algo similar a la relación entre la lista enlazada unidireccional y la lista doblemente enlazada. list., la implementación del nodo interno de LinkedBlockingQueue y LinkedBlockingDeque es la diferencia entre la lista enlazada unidireccional y la lista doblemente enlazada. Consulte el código fuente para obtener más detalles.

En el segundo punto, algunas personas pueden tener preguntas sobre la diferencia entre dos bloqueos mutex y un bloqueo mutex. Podemos considerar el siguiente escenario:

El subproceso A realiza la operación de cola primero y el subproceso B realiza la operación de retirada de cola inmediatamente. Si es un LinkedBlockingQueue, el proceso de cola del subproceso A aún no ha finalizado (el adquirido). el bloqueo aún no se ha liberado), y el subproceso B La operación de eliminación de cola no se bloqueará ni esperará (el bloqueo es diferente. Si es un LinkedBlockingDeque, entonces el subproceso B se bloqueará y esperará a que el subproceso A complete la operación). antes de continuar

La operación general de LinkedBlockingQueue es obtener el bloqueo. Sin embargo, algunas operaciones (como las operaciones de eliminación) necesitan obtener dos bloqueos al mismo tiempo. Esto se explicó en la sección anterior. explicación de LinkedBlockingQueue

Debido a que LinkedBlockingQueue es una estructura de lista enlazada individualmente, las operaciones solo se pueden realizar en un extremo y la lectura solo se puede realizar en el encabezado. La escritura solo se puede realizar en la cola. dos cerraduras son más eficientes. LinkedBlockingDeque Debido a que es una estructura de lista de doble enlace que puede leer y escribir operaciones al principio y al final de ambos extremos, solo se puede usar un bloqueo para garantizar la atomicidad.

ArrayBlockingQueue

LinkedBlockingQueue

La pregunta es, ¿por qué? ArrayBlockingQueue no puede usar dos bloqueos

Porque después de la eliminación, los elementos en ArrayBlockingQueue deben moverse hacia adelante.

LinkedBlockingQueue se implementa internamente como una única lista vinculada, que solo puede obtener elementos del encabezado y agregar elementos del final. Hay bloqueos separados para agregar elementos y obtener elementos, lo que significa que LinkedBlockingQueue se lee y escribe por separado, y las operaciones de lectura y escritura se pueden ejecutar en paralelo.

LinkedBlockingQueue a **** tiene tres constructores, a saber, el constructor sin parámetros, el constructor que puede especificar la capacidad y el constructor que se puede enhebrar en un contenedor. Si llama al constructor sin especificar parámetros al crear una instancia, la capacidad predeterminada de LinkedBlockingQueue es Integer.MAX_VALUE, lo que probablemente conducirá a una situación en la que la cola no está llena pero la memoria sí (desbordamiento de memoria).

El método size() atravesará toda la cola y la complejidad del tiempo es O (n), por lo que es mejor usar isEmtpy

1. Determine si el elemento está vacío y tírelo cuando esté vacío. Excepción

2. Agregue un bloqueo (bloqueo interrumpible)

3. Determine si la longitud de la cola alcanza la capacidad y, de ser así, espere para siempre <. /p>

4. Si no hay cola Llena.

> 4. Si ninguna cola está llena, enqueue() agrega elementos al final de la cola

5. La longitud de la cola aumenta en 1. Si la cola no está llena en este momento, se envía una señal llamado para despertar otras colas bloqueadas

1. Bloquear (aún ReentrantLock), tenga en cuenta que el bloqueo y la escritura aquí son dos bloqueos diferentes

2. Determine si la cola está vacía y si está vacía, espere Cola

3. Obtenga datos a través del método de eliminación de cola

3. Obtenga los elementos en la cola después de que la cola esté vacía. despertar otras colas de espera

Principio: al insertar un elemento al final de la cola, si la cola no está llena, devuelve verdadero inmediatamente; si la cola está llena, devuelve falso inmediatamente; p> Principio: si no hay ningún elemento, devuelve nulo; si hay un elemento, lo retira de la cola

1. Diagrama específico de dentro y fuera de la cola:

Cada elemento de la cola primera mitad de la figura Cada nodo representa los datos encapsulados x, y los siguientes nodos representan la siguiente referencia a este punto.

1.1. Inicialización

Después de la inicialización, inicializa un dato para vaciarlo, y tanto el nodo principal como el nodo final serán este nodo.

1.2. Pasar dos elementos en la cola

1.3 Salir de la cola después de pasar un elemento

En la superficie, simplemente cambia el nodo principal. El puntero apunta al x1.next eliminado. De hecho, está bien pensarlo de esta manera, pero en realidad jdk elimina el nodo principal original, y el nodo principal se muestra en la figura anterior. El nodo principal que ve arriba es el nodo x1 que acaba de salir de la cola, pero su valor ha sido invalidado.

2. Tres tipos de comparación dentro de la cola:

3. Tres tipos de comparación fuera de la cola: .