El principio subyacente de Java volátil

Introduccion

  1. Las variables modificadas por volátiles en el lenguaje Java pueden garantizar la visibilidad en escenarios de subprocesos,
  2. Evitar que la instrucción del procesador reordenación reordenamiento de instrucciones en un entorno multiproceso, no habrá problemas de visibilidad

Es decir, hay un subproceso AB, que puede acceder a la variable volátil x.
Cuando el subproceso A modifica x, el subproceso B puede acceder a la variable x nuevamente para obtener el último valor de x.
Las variables no volátiles no pueden garantizar esto.

Principio de visibilidad

Si el modificador de variable volátil se usa correctamente, será más barato usarlo y ejecutarlo que sincronizarlo, ya que no causará el cambio y la programación del contexto del hilo.

Cuando se escribe una variable compartida decorada con una variable volátil, se usa el código de ensamblaje de bloqueo. La instrucción con el prefijo de bloqueo causará dos cosas bajo un procesador de múltiples núcleos.

  1. Los datos de la línea de caché del procesador actual se volverán a escribir en la memoria del sistema.
  2. Esta operación de volver a escribir en la memoria hará que los datos almacenados en caché en la dirección de memoria en otras CPU sean inválidos. (Otras CPU invalidan el caché a través del rastreo de caché)

Principio de prevención de reordenamiento

  1. Inserte la barrera StoreStore antes de cada operación de escritura volátil y la barrera StoreLoad después de la operación de escritura
  2. Inserte una barrera LoadLoad antes de cada operación de lectura volátil, y una barrera LoadStore después de una operación de lectura;

barrera de memoria java

  • La barrera de memoria de Java generalmente se llama los cuatro tipos, a saber, LoadLoad, StoreStore, LoadStore, StoreLoad es en realidad una combinación de los dos anteriores, completa una serie de barreras y funciones de sincronización de datos.
  • Barrera de LoadLoad: para tales declaraciones Load1; LoadLoad; Load2, antes de acceder a los datos que debe leer Load2 y a las operaciones de lectura posteriores, asegúrese de que los datos que va a leer Load1 sean leídos.
  • Barrera de StoreStore: para tales declaraciones Store1; StoreStore; Store2, antes de realizar Store2 y las operaciones de escritura posteriores, asegúrese de que las operaciones de escritura de Store1 sean visibles para otros procesadores.
  • Barrera de LoadStore: para tales sentencias Load1; LoadStore; Store2, antes de que Store2 y las operaciones de escritura posteriores se eliminen, asegúrese de que los datos que va a leer Load1 sean leídos.
  • Barrera de StoreLoad: para tales declaraciones Store1; StoreLoad; Load2, antes de que se realice Load2 y todas las operaciones de lectura posteriores, asegúrese de que las escrituras de Store1 sean visibles para todos los procesadores. Su techo es la mayor de las cuatro barreras. En la mayoría de las implementaciones de procesadores, esta barrera es una barrera omnipotente, que combina las funciones de las otras tres barreras de memoria.

Cita

https://www.jianshu.com/p/2ab5e3d7e510
https://www.cnblogs.com/chenssy/p/6379280.html

17 artículos originales publicados · ganó 24 · vistas 280,000 +

Supongo que te gusta

Origin blog.csdn.net/qq_22956867/article/details/79400428
Recomendado
Clasificación