Introducción a la pregunta distribuida y de alta concurrencia-1-concurrencia

1. Análisis de código:

public class SynTest {
    
    
    private static int count=0;
    public static void addCount(){
    
    
        try {
    
    
            Thread.sleep(2);
        } catch (InterruptedException e) {
    
    
            e.printStackTrace();
        }
        count++;
    }

    public static void main(String[] args) throws InterruptedException{
    
    
        for(int i=0;i<1000;i++){
    
    
            new Thread(()->SynTest.addCount()).start();
        }
        Thread.sleep(3000);
        System.out.println("count:"+count);
    }
}

2. Resultado de la ejecución:

Inserte la descripción de la imagen aquí

3. La causa del problema

1. Visibilidad
2. Atomicidad

4: análisis de recuento ++

4.1: instrucciones de JVM

Inserte la descripción de la imagen aquí

4.2: Análisis

Si sigue estrictamente el orden de 14 => 19 (atomicidad), no habrá ningún problema, entonces, ¿dónde ocurre el problema? Ese es el entrenamiento de rotación de la CPU. Los pasos de ejecución de la CPU para el cambio de subproceso son los siguientes:
1> El cambio de subproceso ocurre cuando el subproceso A se ejecuta para contar = 0, la CPU ejecuta el subproceso B, el subproceso B finaliza todos los pasos y el conteo = 1;
2> La CPU vuelve a cambiar un hilo, el recuento en el registro del hilo A sigue siendo 0, continúa ejecutando el código del hilo A, después de que termina el hilo A, cuenta = 1;
3> Después de que terminan los dos hilos, el recuento es 1, no el esperado 2

被切换
B
CPU
ThreadA
A线程寄存器中count=0
线程切换
A线程中count++
A线程中count=1写入内存
B线程寄存器count=0
ThreadB
B线程count++
B线程中count=1写入内存

Supongo que te gusta

Origin blog.csdn.net/qq_28500837/article/details/109648710
Recomendado
Clasificación