A veces, la optimización de compiladores y procesadores hará que el tiempo de ejecución sea diferente de lo que imaginamos. Por esta razón, Java ha impuesto algunas restricciones a los compiladores y procesadores. El Modelo de memoria Java (JMM) los resume para que no sea necesario considerar tantos detalles subyacentes al escribir código, y asegura que "siempre que siga las reglas JMM para escribir un programa, el resultado de ejecución debe ser correcto".
Estructura abstracta de JMM
En Java, todas las instancias y las variables estáticas se almacenan en la memoria de almacenamiento moneda, que se puede compartir entre hilos, y esta parte también se llama variables compartidas . Las variables locales, los parámetros de definición de métodos y los parámetros de manejo de excepciones están en la pila, y la memoria de la pila no se comparte entre los subprocesos.
Sin embargo, debido a la optimización del compilador y el procesador, habrá problemas de visibilidad con variables compartidas. Por ejemplo, en múltiples procesadores, los hilos se pueden ejecutar en diferentes procesadores, y el caché inconsistente entre los procesadores causará problemas de visibilidad con variables compartidas . Es posible que dos hilos vean diferentes valores de la misma variable.
JMM resume las optimizaciones realizadas por estos hardware en que cada hilo tiene una memoria local. Cuando necesite leer y escribir variables compartidas, copie una copia de la memoria principal a la memoria local. Al escribir variables compartidas, escríbalas primero en la memoria local y luego actualice a la memoria principal en algún momento en el futuro. Cuando la variable compartida se lea nuevamente, solo se leerá de la memoria local.
De esta manera, la comunicación entre hilos requiere dos pasos:
Write Thread: Actualice la memoria local y lea el hilo: lea el valor actualizado de la memoria principal
De esta manera, hay un retraso entre la escritura y la lectura: ¿Cuándo se actualizará la memoria local a la memoria principal? Esto lleva a problemas de visibilidad, y diferentes hilos pueden ver diferentes variables compartidas.
sucede antes
Literalmente ocurre antes de "antes de suceder antes de esto". Esta es la regla que Java se formula en el orden de ejecución del programa, y se debe seguir la sincronización. De esta manera, los programadores solo necesitan escribir el programa sincrónico correcto, y sucede antes de que los resultados de la ejecución no estén mal.
A sucede antes de B no solo significa que A se ejecuta antes de B, sino que también significa que el resultado de ejecución de A es visible para B, lo que garantiza la visibilidad.
A Happense-antes B, A no tiene que ser ejecutado antes de B. Si AB se alterna y los resultados de la ejecución aún son correctos, el compilador y el procesador pueden optimizar el reordenamiento. Entonces, mientras los resultados del programa sean correctos, no hay ningún problema con cómo el compilador y el procesador lo optimizan y reordenan, y todo es bueno.
Hubas las reglas antes
Reglas de secuencia del programa: en un hilo, la operación de bloqueo de bloqueo después de que la operación anterior ocurre antes: para el mismo bloqueo, desbloquee se realiza antes y bloquea las reglas de dominio volátil: escriba la variable volátil y lea cualquiera de las variables volátiles después de ocurrir antes. Transitividad de la operación: A ocurre antes de B, B ocurre antes de c, entonces A HACEBRE-Before C Start () Reglas: Si el subproceso A ejecuta Threadb.start (), entonces Threadb.Start () ocurre antes de cualquier operación unirse () en el hilo B: si hilo A ejecuta Threadb.Join (), luego todas las operaciones en Thread B-Befefore Threadb.Join ()
El siguiente ejemplo ayuda a entender, ¡
doble pi = 3.14; // Adouble r = 1.0; // bdouble área = pi * r * r; //DO
Aquí hay tres relaciones antes, las reglas 1 y 2 son reglas de orden de programa, y las reglas 3 se derivan de las reglas transitivas:
Un lugar antes de que BB ocurra antes de que CA ocurra antes de c
C depende de A y B, pero ni A ni B dependen de ello. Entonces, incluso si A y B se reordenan, los resultados de la ejecución no cambiarán. En este reordenamiento, JMM se está ejecutando.
Las siguientes dos secuencias de ejecución son correctas.
Lo anterior es todo el contenido que hemos compilado para usted sobre el aprendizaje del modelo de memoria Java JMM. Para obtener más preguntas, deje un mensaje a continuación para discutir. Gracias por su apoyo a Wulin.com.