¿Cómo asegura Volatile la visibilidad?

Bajo el procesador x86, use la herramienta para obtener las instrucciones de ensamblaje generadas por el compilador JIT para ver qué hará la CPU al escribir Volatile.

Código Java:

instancia = new Singleton (); // instancia es una variable volátil

Código de ensamblaje:

0x01a3de1d: movb $ 0x0,0x1104800 (% esi);

0x01a3de24: bloquear addl $ 0x0, (% esp);

Al escribir una variable compartida modificada con una variable volátil, habrá una segunda línea de código ensamblador . Al revisar el manual del desarrollador de software de arquitectura IA-32, podemos ver que la instrucción de prefijo de bloqueo causará dos cosas en procesadores de múltiples núcleos.

  • Los datos de la línea de caché del procesador actual se volverán a escribir en la memoria del sistema.
  • Esta operación de volver a escribir en la memoria invalidará los datos almacenados en caché en esa dirección de memoria en otras CPU.

Para mejorar la velocidad de procesamiento, el procesador no se comunica directamente con la memoria, sino que primero lee los datos de la memoria del sistema en el caché interno (L1, L2 u otro) antes de realizar la operación, pero después de la operación, no se sabe cuándo se escribirán en la memoria. Si se realiza una operación de escritura en la variable volátil declarada, la JVM enviará una instrucción de prefijo de bloqueo al procesador para escribir los datos de la línea de caché donde se encuentra la variable en la memoria del sistema. Pero incluso si se vuelve a escribir en la memoria, si el valor de la caché de otros procesadores aún es antiguo, habrá problemas al realizar operaciones de cálculo. Por lo tanto, para asegurar que las cachés de cada procesador sean consistentes, la caché será consistente. Protocolo, cada procesador verifica si el valor de su caché está caducado olfateando la distribución de datos en el bus. Cuando el procesador encuentra que la dirección de memoria correspondiente a su línea de caché ha sido modificada, cambiará la línea de caché del procesador actual Establecido en un estado no válido, cuando el procesador desea modificar los datos, forzará la lectura de los datos de la memoria del sistema al caché del procesador nuevamente .

Autocomprensión: la variable compartida de instancia en la memoria del sistema. Cuando varios subprocesos acceden a este objeto al mismo tiempo, como se muestra en la figura, cpu1 accede a la instancia a través del subprocesoA y cpu2 accede a la instancia a través del subproceso B. Para mejorar la velocidad de procesamiento, el procesador no se comunica directamente con la memoria, y Es primero leer los datos de la memoria del sistema en el caché y luego realizar la operación. Si la instancia de la variable es modificada por la palabra clave volátil, cpu1 modifica los datos de la instancia en el caché y los escribe inmediatamente en la memoria del sistema a través del bus del sistema, y otros procesadores lo difunden olfateando el bus. Los datos se utilizan para verificar si el valor de su propia caché ha expirado. Cuando el procesador encuentra que la dirección de memoria correspondiente a su línea de caché ha sido modificada, establecerá la línea de caché del procesador actual en un estado no válido y cuando el procesador quiera modificar los datos Cuando, obligará a que los datos se lean de la memoria del sistema al caché del procesador nuevamente.

Supongo que te gusta

Origin blog.csdn.net/qianzhitu/article/details/103052040
Recomendado
Clasificación