Estructura de datos de concurrencia de Java: lista concurrente

Java Concurrency Data Structure Concurrent List

Prefacio


Debido a las diferentes características de los programas en paralelo y en serie, es posible que algunas estructuras de datos adecuadas para programas en serie no funcionen directamente en un entorno concurrente. Esto se debe a que estas estructuras de datos no son seguras para subprocesos, por lo que se centran en aprender sobre entornos concurrentes. ¿Cuáles son las estructuras de datos de seguridad comunes para List, Set y Map? Este artículo registra el contenido de aprendizaje de la Lista concurrente.

Implementación de lista segura


1.Vector
2.Collections.synchronizedList (Lista de lista) ;
3.CopyOnWriteArrayList (principalmente verlo)



Lista concurrente de CopyOnWriteArrayList


Vector o CopyOnWriteArrayList es una implementación de lista segura de dos subprocesos. ArrayList no es seguro para subprocesos porque debe intentar evitar el uso de ArrayList en un entorno de subprocesos múltiples. Si debe usarlo por alguna razón, también debe usar el siguiente empaque:



|_+_|

La implementación interna de CopyOnWriteArrayList es diferente de Vector. Como puede verse en la definición, Copy-On-Write es el mecanismo de implementación de CopyOnWriteArrayList. Es decir, cuando el objeto realiza una operación de escritura, el objeto se copia si es una operación de lectura, la estructura se devuelve directamente y la sincronización no se realiza durante la operación.
CopyOnWriteArrayList hace un buen uso de la invariancia del objeto. Antes de que se escriba el objeto, dado que el objeto no ha cambiado, no se necesita ningún bloqueo. Cuando intente cambiar un objeto, siempre obtenga una copia del objeto, luego modifique la copia y finalmente vuelva a escribir la copia.
La idea central de esta implementación es lograr la contención de bloqueo, lo que mejora el rendimiento de lectura en alta concurrencia, pero sacrifica el rendimiento de escritura hasta cierto punto.
Profundice más en el código fuente de CopyOnWriteArrayList. La implementación de su método get ():



|_+_|

Puede verse que, como implementación segura para subprocesos, el método get () de CopyOnWriteArrayList no tiene ninguna operación de bloqueo. No es necesario bloquearlo al leer. Si varios subprocesos están agregando datos a ArrayList durante la lectura, la lectura aún se leerá. Datos antiguos, porque el ArrayList antiguo no se bloqueará cuando se escriba. Y compare la implementación del vector get:

|_+_|

Vector usa una palabra clave de sincronización, y todas las operaciones get () deben buscarse antes de que el objeto pueda multiplicarse. En situaciones de alta concurrencia, una gran cantidad de competencia de bloqueos puede reducir el rendimiento del sistema.

La implementación de su método add ():



|_+_|

Se puede encontrar que debe bloquear al agregar; de lo contrario, N multiproceso copiará N copias, por lo que el rendimiento de escritura obviamente no es bueno.

Hay otros contenidos remotos, claros, clonados, etc. y el uso de ArrayList es básicamente el mismo, los interesados ​​pueden verlo usted mismo, en comparación con la diferencia en ArrayList.

La implementación de lectura y escritura de CopyOnWriteArrayList también es relativamente simple. Echemos un vistazo a su escenario de aplicación.

Escenario de aplicación de CopyOnWriteArrayList

El tema de esta película es la lista de seguridad concurrente, por lo que se usa principalmente en el escenario donde el subproceso múltiple concurrente tiene operaciones de lectura y escritura en la lista. Por ejemplo, existe un sistema de monitoreo de tráfico, uno de los cuales es contar la IP de acceso de hoy, que obviamente es un escenario concurrente, porque puede haber múltiples accesos al mismo tiempo. Para garantizar estadísticas precisas, puede considerar el uso de CopyOnWriteArrayList. Almacenar datos de ip:

|_+_|

El código es muy simple, pero los compañeros de clase cuidadosos pueden encontrar que acabamos de decir que está bloqueado al escribir, el rendimiento no puede ser muy malo, entonces la pantalla de monitoreo de tráfico en su ejemplo es una escena concurrente + lectura y escritura en tiempo real La escena, esto no es adecuado. Hm ~~~, sí, es así, habrá problemas de rendimiento, que son sus defectos, pero puede garantizar que tus estadísticas de tráfico estén seguras.

para resumir


En una palabra, al agregar elementos, debido a que CopyOnWriteArrayList se copia constantemente, el rendimiento es mucho peor que ArrayList, pero es seguro para subprocesos, por lo que cuándo usarlo depende de su escenario comercial.

RelaxHeart - Tec Blog: Mis más artículos