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:
3. La causa del problema
1. Visibilidad
2. Atomicidad
4: análisis de recuento ++
4.1: instrucciones de JVM
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