Contenedor síncrono Java (JUC) Contenedor concurrente Daquan

¿Qué es un contenedor de sincronización?

同步容器synchronizedLa modificación del contenedor con palabras clave garantiza que solo un subproceso esté utilizando el contenedor a la vez, lo que hace que el subproceso del contenedor sea seguro. Sincronizado significa sincronizado, se refleja en la 多线程变为串行espera de ser ejecutado. (Pero tenga en cuenta que la operación compuesta no garantiza la seguridad del subproceso. Por ejemplo: el primer paso del subproceso A obtiene el nodo de cola, y el segundo paso agrega 1 al valor del nodo de cola, pero cuando el subproceso A finaliza el primer paso, el subproceso B elimina Si se alcanza el nodo de cola, el hilo A informará un puntero nulo al realizar el segundo paso)

¿Qué es un contenedor concurrente?

并发容器Se refiere al permiso 多线程同时使用容器y para garantizar la seguridad del hilo. Con el fin de lograr la concurrencia de maximizar, Java concurrencia kit utiliza una variedad de maneras de mejorar los contenedores de optimización de la eficiencia concurrentes, el núcleo es: , CAS(无锁), COW(读写分离), 分段锁.

Sincronizar clasificación de contenedores

1. Vector

Vector implementa la interfaz List al igual que ArrayList, y sus diversas operaciones en las matrices son las mismas que ArrayList. La diferencia es que todos los métodos de Vertor que pueden ser inseguros para subprocesos se modifican con sincronizado.

2. Pila

Stack es una subclase de Vertor, y Stack implementa la pila avanzada. Se han realizado modificaciones sincronizadas en operaciones tales como stack push y pop.

3. HashTable

HashTable implementa la interfaz Map, y las funciones que implementa son básicamente las mismas (HashTable no puede almacenar nulos, y las claves y los valores de HashMap pueden almacenar nulos). La diferencia es que HashTable utiliza métodos modificados sincronizados.

4. Clases de colecciones sincronizadas proporcionadas por Colecciones

List list = Collections.synchronizedList (new ArrayList ());
Set set = Collections.synchronizedSet (new HashSet ());
Map map = Collections.synchronizedMap (new HashMap ());
De hecho, los tres contenedores anteriores son Colecciones a través del modo proxy La sincronización sincronizada se agrega a la operación original. La granularidad sincronizada es demasiado grande, lo que resulta en una baja eficiencia en el procesamiento de subprocesos múltiples. Por lo tanto, en JDK1.5, se introdujo el contenedor concurrente bajo el paquete concurrente para tratar el problema de la baja eficiencia de procesamiento del contenedor bajo subprocesamiento múltiple.

Clasificación concurrente de contenedores

1. CopyOnWriteArrayList

CopyOnWriteArrayList es equivalente a una ArrayList que implementa la seguridad de subprocesos. Su mecanismo es copiar una matriz de copia cuando hay una operación de escritura en el contenedor y asignar la referencia de matriz de copia al contenedor una vez que se completa la operación. La capa inferior utiliza ReentrantLock para garantizar la sincronización. Pero sacrifica la consistencia del contenedor a cambio de la alta eficiencia de concurrencia del contenedor (los datos antiguos leídos durante la copia). Por lo tanto, no se puede utilizar en escenarios que requieren una gran coherencia.

2. CopyOnWriteArraySet

CopyOnWriteArraySet tiene el mismo principio que CopyOnWriteArrayList, es una colección Set que implementa el mecanismo CopyOnWrite.

3. ConcurrentHashMap

ConcurrentHashMap es equivalente a HashMap que implementa seguridad de subprocesos. Las claves no están ordenadas, y ni la clave ni el valor pueden ser nulos. Antes de JDK8, ConcurrentHashMap usaba un mecanismo de bloqueo segmentado para mejorar la eficiencia de concurrencia, y solo necesitaba bloquearse cuando operaba en pares clave-valor del mismo segmento. Después de llegar a JDK8, se abandonó el mecanismo de segmentación de bloqueo y se utilizó el algoritmo CAS.

4. ConcurrentSkipListMap

ConcurrentSkipListMap es equivalente a un TreeMap que implementa seguridad de subprocesos. Las claves están ordenadas, y ni la clave ni el valor pueden ser nulos. Utiliza un mecanismo de tabla de salto para reemplazar los árboles rojos y negros. ¿Por qué no seguir usando árboles rojos y negros? Debido a que el árbol rojo-negro debe rotarse y ajustarse al insertar o eliminar nodos, la granularidad que debe controlarse es mayor. La tabla de salto utiliza una lista vinculada, que utiliza un mecanismo CAS sin bloqueo para lograr una alta seguridad de subprocesos concurrentes.

5. ConcurrentSkipListSet

ConcurrentSkipListSet tiene el mismo principio que ConcurrentSkipListMap, es un TreeSet que logra una alta seguridad de hilos concurrentes.

Tipo de cola

Tipo de bloqueo

1. ArrayBlockingQueue

ArrayBlockingQueue es una cola segura de subprocesos de bloqueo limitada implementada con una matriz. Si continúa introduciendo elementos en la cola completa, hará que el hilo actual se bloquee. Si obtiene un elemento de una cola vacía, hará que el hilo actual se bloquee. Utilice ReentrantLock para garantizar la seguridad del hilo en situaciones concurrentes.

2. LinkedBlockingQueue

LinkedBlockingQueue es una lista unidireccional basada en una cola de bloqueo FIFO arbitraria (de hecho limitada). Las operaciones de acceso y eliminación se realizan al frente del equipo, las operaciones de adición se realizan al final del equipo y se utilizan diferentes bloqueos para la protección. Solo se pueden bloquear dos operaciones al mismo tiempo para operaciones que pueden involucrar múltiples nodos.

3. PriorityBlockingQueue

PriorityBlockingQueue es una cola de bloqueo ilimitada que admite prioridad. Por defecto, los elementos están ordenados en orden ascendente en orden natural. También puede implementar el método compareTo () de la clase personalizada para especificar las reglas de clasificación de elementos,

4. DelayQueue

DelayQueue es una cola de bloqueo ilimitada implementada internamente mediante colas de prioridad. Al mismo tiempo, cuánto tiempo deben esperar los datos del nodo del elemento antes de poder acceder a ellos. Cuando la cola de recuperación de datos está vacía, espere, hay datos, pero el tiempo de espera es tiempo extra cuando no se alcanza el tiempo de retraso.

5. SynchronousQueue

SynchronousQueue no tiene capacidad. Es una cola de bloqueo que no almacena elementos. Entregará los elementos directamente a los consumidores. Debe esperar a que se consuman los elementos agregados en la cola antes de poder continuar agregando nuevos elementos. Equivalente a una cinta transportadora con una capacidad de 1.

6. LinkedTransferQueue

LinkedTransferQueue es una cola de bloqueo de transmisión ilimitada compuesta de listas vinculadas. Combina las ventajas de ConcurrentLinkedQueue, SynchronousQueue, LinkedBlockingQueue, etc. El mecanismo específico es más complicado.

7. LinkedBlockingDeque

LinkedBlockingDeque es una cola de bloqueo bidireccional compuesta por una estructura de lista vinculada. La llamada cola de dos vías se refiere a que los elementos se pueden insertar y eliminar de ambos extremos de la cola.

Sin bloqueo

1. ConcurrentLinkedQueue

ConcurrentLinkedQueue es una cola no bloqueada, ilimitada y segura para subprocesos. Su estructura de datos subyacente se implementa mediante una lista enlazada individualmente. Las operaciones en cola y en cola utilizan el CAS que mencionamos a menudo para garantizar la seguridad del subproceso.

Publicado 248 artículos originales · elogiado 416 · 90,000 vistas +

Supongo que te gusta

Origin blog.csdn.net/qq_33709508/article/details/105447391
Recomendado
Clasificación