[Reprint] volátil y sincronizada al final lo que diferencia? Y la explicación más gráfica le diga

volátil y sincronizada al final lo que diferencia? Y la explicación más gráfica le diga

https: // segmentfault.com/a/1190000021928013

 

  • Usted tiene una idea, tengo una idea, que el intercambio, una persona tendrá dos ideas
  • Si no se puede explicar en pocas palabras, usted no entiende lo suficientemente bien

Demostración está retirando paulatinamente el código y organizar artículos técnicos, junto  práctica de la selección Github  , facilitan la lectura de vista, este artículo también se incluye en esta, me siento bien, por favor Estrella

Previo por escrito varias  programación Java serie concurrente de  artículos, un amigo me preguntó dónde micro-grupo, todavía no puede entender  volatile y la  synchronized diferencia entre los dos, su principal problema se puede resumir como éstos:

  • volátil y sincronizada en el procesamiento de qué temas son relativamente equivalentes?
  • ¿Por qué volátil es la manera sincronizada sincronización débil?
  • Además de la visibilidad del tema volátil, sino también para resolver el problema?
  • ¿Cómo elijo a usarlos?

Si no puede responder a algunas preguntas anteriores, muestra que a distinguir entre los dos y algo vaga. En este trabajo, buena para hablar de su relación sutil a modo gráfico

Han oído [en el cielo un día al año subterránea], supone que la CPU ejecuta una instrucción general de un día, a continuación, la CPU y la memoria de escritura leer, hay que esperar un año.

[Barril] por el principio de limitación, a los ojos de la CPU, el rendimiento global de la eficacia de la memoria del programa se han tirado hacia abajo, con el fin de resolver esta tabla corta, los estudiantes de hardware también utilizan nuestro software para hacer exceso de velocidad común - Uso en caché caché (en realidad un compañero de clase de hardware al software, los estudiantes cavado hoyo)

Java modelo de memoria (JMM)

aumentos de caché CPU equilibra la diferencia entre la velocidad de la memoria, este aumento o varias capas.

En este momento, la placa de corta memoria ya no es tan claro, la CPU Jinki. Pero traerá una gran cantidad de problemas

La figura de fantasía, cada núcleo tiene su propia caché (L1 Cache), también hay una arquitectura común a todos cache secundaria nuclear (L2 Cache). Después de usar la memoria caché, cuando un hilo para el acceso compartido de variables, si existe la variable compartida en L1, no lo hará paso a paso hasta que la memoria principal de la visita. Así, de esta forma, para compensar la tabla corta memoria de acceso lento

En concreto, el hilo de lectura / escritura compartida variables tales pasos son:

  1. Copiar la variable compartida de la memoria principal en su memoria de trabajo
  2. Las variables se procesan en la memoria de trabajo
  3. Después del procesamiento, los valores de la variable actualizada en la memoria principal

Supongamos ahora que la memoria principal tiene una X variable compartida, que es el valor inicial de 0

Enhebrar 1 para acceder a la variable X, aplicar el procedimiento anterior es la siguiente:

  1. L1 y L2 no se encuentran las variables X, hasta que se encuentra en la memoria principal
  2. Copiar variable X a L1 y L2
  3. Modificar el valor de X en la L1 es 1, y de vuelta escrito a la capa de la memoria principal por la capa

En este momento, en los ojos del hilo 1, el valor de X es la siguiente:

A continuación, el hilo 2 de acuerdo con el procedimiento anterior para acceder a la misma variable X

  1. L1 no se encuentra en la variable X
  2. L2 encontrado variable X
  3. L2 de L1 se copia en variables
  4. Modificará el valor de x es 2 L1, capa por capa, y la parte posterior escrito a la memoria principal

En este caso, el hilo 2 ojos, el valor de X es la siguiente:

Combinar dos operaciones justo cuando el hilo 1 y luego acceder a la variable x, vemos cuál es el problema:

Por el momento, si el hilo de nuevo 1 x = 1 write-back, hilo 2 cubrirá los resultados de x = 2, la misma variable compartida, el resultado no es el mismo para obtener el hilo (el hilo 1 en los ojos de x = 1; x = rosca 2 ojos 2), que son las variables de memoria compartida no son problema visible.

Colgarlo cómo? Hoy en día, el debut de dos personajes principales, pero antes de explicar la palabra clave volátil, digamos que está más familiarizado con la palabra clave sincronizada

sincronizada

Problemas encontrados flujos seguros, habitual pensar con la palabra clave sincronizada para resolver el problema, primero vamos, si el enfoque es razonable, nos fijamos en la palabra clave sincronizada es la forma de resolver las variables compartidas se mencionó anteriormente, la visibilidad de los problemas de memoria

  • [] En la memoria semántica se sincroniza bloques de las variables utilizadas en el bloque sincronizado se borra de la memoria de trabajo de la rosca, la lectura de la memoria principal
  • Sale del bloque de la memoria semántica para modificar las cosas sincronizadas variables compartidas en el bloque sincronizado enrojeció a la memoria principal

Aparte de cualquier otra cosa, para ver implacable volátil a la baja

volátil

Cuando se declara una variable tan volátil:

  • Tema [lecturas] en las variables compartidas, primero despejar el valor de la variable memoria local, y luego obtener los valores más recientes de la memoria principal
  • [Escrito] en la variable compartida hilo, el valor no se almacena en registros u otros lugares (es decir, sólo decir la llamada "memoria de trabajo"), pero el valor se actualizará de nuevo a la memoria principal

Tipo de sentimiento un nuevo nombre, nos fijamos en toda verdadera

Por lo tanto, cuando se utiliza sincronizados o volátiles, los pasos multiproceso variable compartida se convierte así:

ya no es un simple punto, el valor de referencia L1 y L2 de la variable compartida, pero el acceso directo a la memoria principal

Hasta el punto práctico, los ejemplos

public class ThreadNotSafeInteger {
    /** * 共享变量 value */ private int value; public int getValue() { return value; } public void setValue(int value) { this.value = value; } }

Tras el análisis de cama preámbulo, está claro que el código anterior, el valor de la variable compartida no es un gran riesgo para tratar de hacer algunos cambios a su

El primer uso de la palabra clave volátil actualización:

public class ThreadSafeInteger {
    /** * 共享变量 value */ private volatile int value; public int getValue() { return value; } public void setValue(int value) { this.value = value; } }

A continuación, utilice la reforma palabra clave sincronizada

public class ThreadSafeInteger {
    /** * 共享变量 value */ private int value; public synchronized int getValue() { return value; } public synchronized void setValue(int value) { this.value = value; } }

Estos dos resultados son idénticos, el [actual] sobre la cuestión de la visibilidad de las soluciones de datos variables compartidas, tanto considerarse equivalente

Si sincronizados y volátiles son exactamente lo mismo, entonces tenemos que diseñar dos palabras clave, y continuar a ver un ejemplo

@Slf4j
public class VisibilityIssue { private static final int TOTAL = 10000; // 即便像下面这样加了 volatile 关键字修饰不会解决问题,因为并没有解决原子性问题 private volatile int count; public static void main(String[] args) { VisibilityIssue visibilityIssue = new VisibilityIssue(); Thread thread1 = new Thread(() -> visibilityIssue.add10KCount()); Thread thread2 = new Thread(() -> visibilityIssue.add10KCount()); thread1.start(); thread2.start(); try { thread1.join(); thread2.join(); } catch (InterruptedException e) { log.error(e.getMessage()); } log.info("count 值为:{}", visibilityIssue.count); } private void add10KCount(){ int start = 0; while (start ++ < TOTAL){ this.count ++; } } }

De hecho, el operador de asignación sencilla por encima de setValue (this.value = valor;) se convierte en (this.count ++;) forma, si se ejecuta el código, se encuentra que el valor de recuento es siempre de entre 1W y 2W

El método y a continuación, por encima de hacer cambios en la forma de sincronizado

@Slf4j
public class VisibilityIssue { private static final int TOTAL = 10000; private int count; //... 同上 private synchronized void add10KCount(){ int start = 0; while (start ++ < TOTAL){ this.count ++; } } }

Ejecute el código de nuevo, resultado del recuento es 2w

Dos conjuntos de código son modificados por la palabra clave volátil y sincronizados en la misma forma, la forma en que algunos pueden traer los mismos resultados, pero algunos no se puede?

Vamos a hablar de la diferencia entre los dos

cuenta ++ código de programa es una línea, sino que se tradujo en la instrucción de la CPU es realmente tres líneas (no creo que utilizó  javap -c  para tratar de comandos)

sincronizada es un bloqueo exclusivo / bloqueo exclusivo (es decir, no tiene a qué me refiero), mientras que sólo un hilo llama al  add10KCount método, el otro subproceso de llamada se bloqueará. Así que tres líneas de instrucciones de la CPU son el mismo hilo después de la ejecución de otro hilo para continuar la ejecución, ésta es la charla habitual de atómicas (hilos ejecutar múltiples instrucciones no son interrumpidos)

Pero volátil no bloqueante algoritmo (es decir, no exclusivamente), cuando se enfrentan a tres líneas de instrucciones de la CPU, naturalmente, ninguna garantía de que otro hilo no se involucra, y esto se conoce comúnmente, memoria volátil para asegurar la visibilidad, pero no puede atomicidad garantía

En resumen, que cuando se podría utilizar la palabra clave volátil que? (Tenga en cuenta, lo importante decirlo tres veces, siento que esta frase fuera de fecha)

Si la escritura no depende del valor actual de la variable valor de la variable, puede ser una volátil 
valor si la variable de escritura independiente, el valor actual de la variable, que puede ser una volátil 
si el valor de la variable se escribe no depende del valor actual de la variable, puede utilizar volátil

Por ejemplo, el recuento anterior ++, es obtener - computación - escritura operación de tres pasos, que depende del valor actual, no puede resolver el problema mediante la volátil

Aquí, la primera pregunta principio del artículo [volátil y sincronizada en el procesamiento de qué temas son relativamente equivalentes? ] La respuesta se ha dado a conocer

Para reparar su propio cerebro, si se deja el mismo período de tiempo para escribir unas pocas líneas de código [] [cantidad de dinero] irá al número poco dinero para ir [cantar], [canción una y otra vez a escribir código], varias veces con frecuencia esta operación, sino también para conectar la última operación (y luego escribir el código, el dinero acumulado número de canciones y luego cantar) también es necesario para asegurarse de que no hay errores, cansado?

sincronizada es exclusiva, haciendo cola hilo tendrá que cambiar, este interruptor es como el ejemplo anterior, para completar el cambio, hay que recordar la última operación cuasi-roscado, la CPU cansado cerebro, que a menudo se dice que un cambio de contexto lo traerá gran sobrecarga

volátil no es el caso, es no-bloqueo, por lo que cuando se comparte variables para resolver el problema de la visibilidad, se sincroniza volátil que refleja la sincronización débil

Con esto, la segunda pregunta del artículo [¿Por qué volátil es la manera sincronizada sincronización débil? ] También debería conseguir que el punto

Además de la visibilidad volátil puede resolver el problema, sino también resolver el problema de la reordenación de optimización del compilador, se han introducido artículos anteriores, por favor haga clic en el enlace a verse a sí mismos como (la entrevista las preguntas más frecuentes para duplicar controlar la traba de Singleton ¿Por qué no se hilo de seguridad demasiado la respuesta se puede encontrar en el interior oh):

Después de leer estos dos artículos, creo que el tercer problema será resuelto

Sabiendo esto, yo creo que se sabe cómo utilizar el

Selecta, y finalmente terminado de clasificar la primera edición de la tecnología Java pila de datos del núcleo duro, detrás de las escenas respuesta [información] en cartas privadas / [666] se

cuestionamiento alma

  1. A entender el ciclo de vida de la rosca que? flujo estado diferente es lo que?
  2. ¿Por qué hilo tiene notificación mecanismo de alerta?

El siguiente artículo, nos dicen que [¿Por qué no despierta el hilo sugerido notifyAll notificación que sugiere que? ]
Blog personal: https: //dayarch.top

Doy la bienvenida a la atención del público número "día arco un soldado", pila diversión tecnología original de Java para resolver el problema, va a simplificar cuestiones complejas, problemas gráfica abstracta baja
si está interesado en el contenido de mi tema, o más detrás de las escenas, bienvenido visitar mi blog  dayarch.top

Supongo que te gusta

Origin www.cnblogs.com/jinanxiaolaohu/p/12491731.html
Recomendado
Clasificación