Colección de clases de seguridad de mapas en JUC

Prefacio

La colección de mapas en Java, el tipo comúnmente utilizado es HashMap <K, V> para realizar el almacenamiento de datos de tipo clave-valor. ¡La clave no se puede repetir!

Para obtener más información, consulte el análisis del código fuente de hashmap (jdk1.8)

En la operación de un solo subproceso, la colección tiene una alta disponibilidad, pero con varios subprocesos, la colección todavía tiene el problema de la inseguridad.

Mapa inseguro en Java Multithreading

Como muestra el título, en el subproceso múltiple, varios subprocesos operan la misma colección HashMap y, al agregar elementos, se producirán excepciones simultáneas. El ejemplo de código es el siguiente:

import java.util.*;
public class MapTest {
    
    
    public static void main(String[] args) {
    
    
        Map<String,Object> maps = new HashMap<>();
        for (int i = 1; i <= 40; i++) {
    
    
            new Thread(()->{
    
    
                maps.put(UUID.randomUUID().toString().substring(0,5),"6666");
                System.out.println(Thread.currentThread().getName()+"=="+maps);
            },String.valueOf(i)).start();
        }
    }
}

El registro de ejecución del código es el siguiente: ¡
Inserte la descripción de la imagen aquí
Ha aparecido java.util.ConcurrentModificationException!

Colecciones seguras en la categoría de herramienta Colecciones

import java.util.*;
public class MapTest {
    
    
    public static void main(String[] args) {
    
    
        Map<String,Object> maps = Collections.synchronizedMap(new HashMap<>());
        for (int i = 1; i <= 40; i++) {
    
    
            new Thread(()->{
    
    
                maps.put(UUID.randomUUID().toString().substring(0,5),"6666");
                System.out.println(Thread.currentThread().getName()+"=="+maps);
            },String.valueOf(i)).start();
        }
    }
}

Ejecutar el registro de la siguiente manera:
Inserte la descripción de la imagen aquí
Sin ocurrencia java.util.ConcurrentModificationException, donde la estructura de la fuente se establece de la siguiente manera:
Inserte la descripción de la imagen aquí
Inserte la descripción de la imagen aquí
Como se puede ver en la fuente, la Collections.synchronizedMap(Map<K,V> m)colección generada tomará new HashMap<>()en java.util.Collections.SynchronizedMapseguridad varias clases, en las que el aumento de la operación del elemento fuente es el siguiente:
Inserte la descripción de la imagen aquí
tomar el synchronized同步代码块camino para lograrlo. Garantice los problemas de seguridad de los datos en el caso de varias operaciones de subprocesos.

Colección segura de mapas bajo JUC

Mira los siguientes casos:

import java.util.*;
import java.util.concurrent.ConcurrentHashMap;

public class MapTest {
    
    
    public static void main(String[] args) {
    
    
        Map<String,Object> maps = new ConcurrentHashMap<>();
        for (int i = 1; i <= 40; i++) {
    
    
            new Thread(()->{
    
    
                maps.put(UUID.randomUUID().toString().substring(0,5),"6666");
                System.out.println(Thread.currentThread().getName()+"=="+maps);
            },String.valueOf(i)).start();
        }
    }
}

Los resultados de la operación son los siguientes:
Inserte la descripción de la imagen aquí
no hay información de guardado anormal, y la lógica del código fuente de los elementos agregados es la siguiente: la
Inserte la descripción de la imagen aquí
operación de inserción de datos, las synchronizedpalabras clave adoptadas y la modificación del bloque de código se utilizan para garantizar la seguridad del aumento de datos en subprocesos múltiples.

Supongo que te gusta

Origin blog.csdn.net/qq_38322527/article/details/114758960
Recomendado
Clasificación