Muchos amigos pueden haber oído hablar de la palabra clave volátil y pueden haberla usado. Antes de Java 5, era una palabra clave controvertida, ya que usarla en programas a menudo resultaba en resultados inesperados. Solo después de Java 5, la palabra clave volátil recuperó su vitalidad.
La función de la palabra clave volátil es hacer que todos los subprocesos en el sistema compartan visibles a las variables modificadas por la palabra clave, y puede prohibir la memoria de trabajo del hilo de las variables en caché modificadas por el volátil.
Escenarios de uso volátiles 2:
1. Visibilidad: Java proporciona palabras clave volátiles para garantizar la visibilidad.
Cuando Volatile modifica una variable compartida, asegura que el valor modificado se actualizará a la memoria principal de inmediato, y cuando otros hilos necesiten leerlo, leerá el nuevo valor en la memoria.
Sin embargo, las variables compartidas ordinarias no pueden garantizar la visibilidad, porque no está claro cuándo se escribe la variable compartida normal en la memoria principal después de modificarse. Cuando otros hilos lo leen, el valor antiguo original aún puede estar en la memoria, por lo que no se puede garantizar la visibilidad.
Además, sincronizado y bloqueo también puede garantizar la visibilidad. Sincronized and Lock puede garantizar que solo un hilo adquiere el bloqueo al mismo tiempo y ejecute el código de sincronización. Antes de liberar el bloqueo, la modificación de la variable se actualizará a la memoria principal. Por lo tanto, la visibilidad se puede garantizar.
Veamos primero un código de código. Si el hilo 1 se ejecuta primero y el hilo 2 se ejecuta más tarde:
// hilo 1 boolean stop = false; while (! stop) {dosomthething ();} // hilo 2stop = true;Este código es una pieza de código muy típica, y muchas personas pueden usar este método de marcado al interrumpir los hilos. Pero de hecho, ¿se ejecutará este código completamente correctamente? ¿Se interrumpirá el hilo? No necesariamente. Quizás la mayoría de las veces, este código puede interrumpir los hilos, pero también puede hacer que el hilo no se interrumpa (aunque esta posibilidad es muy pequeña, una vez que esto suceda, causará un bucle muerto).
Explicemos por qué este código puede hacer que el hilo no interrumpa. Como se explicó anteriormente, cada hilo tiene su propia memoria de trabajo durante la operación, por lo que cuando el subproceso 1 se está ejecutando, copiará el valor de la variable de parada y la pondrá en su propia memoria de trabajo.
Luego, cuando el hilo 2 cambia el valor de la variable de parada, pero no ha tenido tiempo de escribirlo en la memoria principal, el hilo 2 va a hacer otras cosas, entonces Thread 1 no sabe sobre los cambios de Thread 2 a la variable de parada, por lo que continuará en bucle.
Pero después de modificar con volátil, se vuelve diferente:
Primero: el uso de la palabra clave volátil forzará el valor modificado que se escriba a la memoria principal de inmediato;
Segundo: si usa la palabra clave volátil, cuando el subproceso 2 la modifica, la línea de caché de la variable de caché se detendrá en la memoria de trabajo de Thread 1 no será válida (si se refleja en la capa de hardware, la línea de caché correspondiente en la caché L1 o L2 de la CPU no es válida);
Tercero: dado que la línea de caché de la variable de caché se detiene en la memoria de trabajo de Thread 1 no es válida, Thread 1 la leerá en la memoria principal cuando lea el valor de la variable parada nuevamente.
Luego, cuando Thread 2 modifica el valor de parada (por supuesto, hay 2 operaciones aquí, modificando el valor en la memoria de trabajo de Thread 2 y luego escribir el valor modificado a la memoria), la línea de caché de la variable de caché se detendrá en la memoria de trabajo de Thread 1 no será válida. Cuando el hilo 1 se lee, encuentra que su línea de caché no es válida. Esperará a que se actualice la dirección de memoria principal correspondiente de la línea de caché, y luego lea el último valor en la memoria principal correspondiente.
Entonces lo que lee el hilo 1 es el último valor correcto.
2. Asegurar el orden
volátil booleano iniciado = falso; // hilo 1: context = loadContext (); iniciado = verdadero; // hilo 2: while (! Inited) {sleep ()} dosomethingwithConfig (contexto);Asegúrese de que el contexto haya sido inicializado.
3. Doble chequeo
class Singleton {private volátil volátil static singleton instancia = null; private singleton () {} public static singleton getInstance () {if (instance == null) {sincronizado (singleton.class) {if (instancia == null) instancia = nueva singleton ();}} devuelve instancia;}}}Lo anterior es una explicación detallada del papel y el uso de la palabra clave volátil en Java presentada por el editor. Espero que te sea útil. Si tiene alguna pregunta, déjame un mensaje y el editor le responderá a tiempo. ¡Muchas gracias por su apoyo al sitio web de Wulin.com!