Tome CountDownLatch como ejemplo para describir brevemente el principio CAS

Para comenzar con un código básico para lograr, la siguiente descripción detallada del código, junto con el video, para aprender aún más detallada y altamente recomendada Educación de Mashi Bing - Sector de TI + Predicación de preguntas frecuentes sobre la matrícula .

AtomicInteger.incrementAndGet ();
Inserte la descripción de la imagen aquí
Inserte la descripción de la imagen aquí
compareAndSwapInt en Inseguro (varios argumentos);
Inserte la descripción de la imagen aquí
aprendido de unsafe.cpp bajo jdk8u cmpxchg = comparar e intercambiar

Serie de lenguaje ensamblador is_MP = Procesador múltiple Determine si la computadora es multiprocesador y, si lo es, agregue la instrucción lock cmpxchg (instrucción no atómica, la implementación subyacente de sincronizado ).
Inserte la descripción de la imagen aquí
A nivel de hardware: la instrucción de bloqueo bloqueará una señal de puente norte al ejecutar las instrucciones siguientes en lugar de utilizar el método de bus de bloqueo (observe el bus de memoria en la figura siguiente).
Inserte la descripción de la imagen aquí


Diagrama esquemático de bloqueo de giro (sin bloqueo):
Inserte la descripción de la imagen aquí
CountDownLatch es una herramienta de sincronización para la comunicación de subprocesos no excluyentes entre sí. Se puede utilizar para coordinar la sincronización de subprocesos y no se puede reutilizar una vez que se inicializa y utiliza.

El principio de funcionamiento de CountDownLatch es combinar un contador para pedirle a un hilo que continúe la ejecución después de esperar a que otros hilos completen su trabajo. El valor inicial del contador es el número total de hilos. Después de que cada subproceso complete su tarea, el valor del contador se reducirá en uno. Cuando el valor del contador es 0, significa que todos los subprocesos han completado la tarea del subproceso y el subproceso que espera en CountDownLatch puede reanudar la ejecución del siguiente tarea.

Fuente reimpresa: Shane Li-Understanding and Use of CountDownLatch

Thread threads[] = new Thread[100];
CountDownLatch latch = new CountDownLatch(threads.length);
for (int i = 0; i < threads.length; i++) {
    threads[i] = new Thread(() -> {
        for (int j = 0; j < 100; j++) {
            m.incrementAndGet(); // m++
        }
        latch.countDown();
    });
}

Arrays.stream(threads).forEach((t) -> t.start());
try {
    latch.await();
} catch (InterruptedException e) {
    e.printStackTrace();
}
System.out.println(m);

Inserte la descripción de la imagen aquí

Supongo que te gusta

Origin blog.csdn.net/qq_44965393/article/details/113756905
Recomendado
Clasificación