English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
A veces, la optimización del compilador y el procesador puede hacer que el runtime no sea como lo imaginamos, por lo tanto, Java impone algunas restricciones al compilador y el procesador, JAVA Memory Model (JMM) abstracta estas, de modo que al escribir código, no es necesario considerar muchos detalles de bajo nivel, y garantiza 'siempre que se escriba el código siguiendo las reglas de JMM, el resultado de ejecución será correcto'.
Estructura abstracta de JMM
En Java, todas las instancias y variables estáticas se almacenan en la memoria heap, que se puede compartir entre hilos, y esta parte también se llamaVariables compartidas. Y 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 hilos.
Y debido a la optimización del compilador y el procesador, puede causar problemas de visibilidad en las variables compartidas, como en procesadores multinúcleo (multi-procesador), los hilos pueden ejecutarse en procesadores diferentes, yLa不一致idad de la caché entre procesadores puede causar problemas de visibilidad en las variables compartidasEs posible que dos hilos vean valores diferentes del mismo variable.
JMM abstracta estas optimizaciones de hardware en que cada hilo tiene una memoria local. Al necesitar escribir y leer variables compartidas, copia una copia de la memoria principal a la memoria local. Al escribir variables compartidas, primero escribe a la memoria local y luego, en algún momento futuro, actualiza a la memoria principal. Al leer variables compartidas nuevamente, solo se lee desde la memoria local.
Por lo tanto, la comunicación entre hilos necesita dos pasos:
Hilo de escritura: actualiza la memoria local a la memoria principal. Hilo de lectura: lee el valor actualizado desde la memoria principal
Así que en la escritura-Hay un retraso entre la lectura y la escritura: ¿cuándo se actualiza la memoria local a la memoria principal? Esto lleva a problemas de visibilidad, y diferentes hebras pueden ver variables compartidas diferentes.
Ocurre-antes de
A primera vista, ocurre-El significado de before es 'ocurre antes'. Esta es la regla que Java establece para el orden de ejecución del programa, y para la sincronización es necesario seguir esta regla. De esta manera, el programador solo necesita escribir un programa de sincronización correcto, ocurre-Before garantiza que el resultado de ejecución no sea incorrecto.
ocurre A-Before B no solo significa que A se ejecuta antes de B, sino que también significa que el resultado de la ejecución de A es visible para B, lo que garantiza la visibilidad.
ocurre A-Before B, A no tiene que ejecutarse antes de B, si A y B alternan, si el resultado de ejecución es correcto, se permite que el compilador y el procesador optimicen el orden. Por lo tanto, siempre que el resultado del programa sea correcto, no importa cómo optimice el compilador y el procesador, ni cómo reordene, todo es bueno.
Ocurre-Regla before
Regla de ordenamiento de programa: en una hebra, las operaciones anteriores ocurren-Reglas de desbloqueo después de lock before: ocurre desbloquear el mismo lock-Reglas del dominio volatile de lock before: escribir volatile variable, ocurre-la transitividad de cualquier operación de lectura de esta variable volatile after: A ocurre-antes de B, B ocurre-antes de C, A ocurre-antes de ThreadB.start() regla: si el hilo A ejecuta ThreadB.start() entonces ThreadB.start() ocurre-antes de cualquier operación de ThreadB en el hilo join() regla: si el hilo A ejecuta ThreadB.join(), entonces todas las operaciones de ThreadB ocurren-antes de ThreadB.join()
Este ejemplo ayuda a entender happens-antes de
double pi = 3.14; //A double r = 1.0; //B double área = pi * r *r; //C
aquí hay tres happens-regla de relación before1,2es la regla de ordenamiento de programa, regla3es deducido por la regla de transitividad:
ocurre A-antes de B, B ocurre-antes de que C A ocurra-antes de C
C depende de A y B, pero A y B no dependen de nadie. Por lo tanto, incluso si A y B se reordenan, el resultado de ejecución no cambiará, esta reordenación es ejecutada por JMM.
Ambos resultados de la secuencia de ejecución son correctos.
Aquí está todo el contenido que hemos organizado sobre el aprendizaje de la estructura de memoria de Java JMM, más preguntas pueden discutirse en los comentarios a continuación, gracias por tu apoyo a la tutorial de grito.
Declaración: el contenido de este artículo se obtiene de la red, pertenece al autor original, el contenido se contribuye y carga espontáneamente por los usuarios de Internet, este sitio no posee los derechos de propiedad, no se ha procesado editorialmente por humanos y no asume ninguna responsabilidad legal relacionada. Si encuentra contenido sospechoso de infracción de derechos de autor, por favor envíe un correo electrónico a: notice#oldtoolbag.com (al enviar un correo electrónico, reemplace # con @) para denunciar, y proporcione evidencia relevante. Una vez verificada, este sitio eliminará inmediatamente el contenido sospechoso de infracción.