Comprender los puntos de conocimiento sincronizados y volátiles de Java

En Java multithreading, si se realizan operaciones simultáneas en una variable compartida, se producirán problemas de seguridad de subprocesos

Comprensión de requisitos previos

palabra clave volátil:

      En un entorno concurrente, cada hilo tendrá su propia memoria de trabajo, cada hilo solo puede acceder a su propia memoria de trabajo y las variables compartidas se cargarán en la memoria de trabajo de cada hilo, por lo que hay un problema aquí, la memoria Cuándo se cargan los datos en la memoria de trabajo del hilo y cuándo se volverá a escribir el contenido de la memoria de trabajo del hilo en la memoria de variables. El manejo inadecuado de estos dos pasos provocará inconsistencias en los datos. Por ejemplo, el hilo A modifica una variable compartida, pero no se vuelve a escribir en la memoria, y el hilo B lee la variable compartida después de cargar los datos en la memoria Son datos sucios. El enfoque correcto es que la modificación del hilo A debería ser visible para el hilo B.

  Un complemento de la visibilidad de la memoria es que la razón por la cual los valores de las variables compartidas que ven varios subprocesos son diferentes es porque cuando los subprocesos ocupan tiempo de CPU, la cpu no interactuará directamente con la memoria para aumentar la velocidad de procesamiento, sino que El contenido compartido en la memoria se leerá primero en el espacio de caché interno, y luego la CPU solo interactuará con el espacio de caché interno durante el procesamiento. Este método de procesamiento causará problemas de visibilidad de la memoria en una máquina de múltiples núcleos.

  Volatile puede resolver el problema de visibilidad de la memoria en un entorno concurrente. Solo necesita agregar la palabra clave volátil delante de la variable compartida para resolverlo. Sin embargo, debe tenerse en cuenta que volatile solo resuelve el problema de visibilidad de la memoria. Aún es necesario para problemas como i ++ Utilice otros métodos para garantizar la seguridad de los hilos. El principio de usar volátil para resolver el problema de visibilidad de la memoria es que si se realiza una operación de escritura en una variable compartida modificada por volátil, la JVM enviará una instrucción de prefijo de bloqueo a la cpu, y la cpu almacenará en caché la línea donde se encuentra la variable (la caché se puede asignar La unidad de caché más pequeña) se vuelve a escribir en la memoria. Pero en el caso de varios procesadores, después de que la línea de caché en una determinada CPU se vuelva a escribir en la memoria del sistema, la caché de la variable en la otra CPU aún es antigua, por lo que habrá problemas al realizar operaciones posteriores, por lo que para Para que el contenido visto por todos los subprocesos sea coherente, es necesario implementar el protocolo de coherencia de caché. La CPU juzgará si su caché expira mediante la supervisión de los datos pasados ​​en el bus. Si expira, debe invalidar la caché. Si la cpu Cuando acceda a la caché nuevamente , encontrará que la caché no es válida, y luego la caché se recargará desde la memoria.

Palabras clave sincronizadas:

  Además de garantizar la atomicidad, sincronizado también garantiza la visibilidad. Debido a que está sincronizado, ya sea un método sincronizado o un bloque de código sincronizado, los datos de la memoria principal se copiarán primero a la memoria de trabajo. Cuando se completa el bloque de código sincronizado, los datos de la memoria de trabajo se actualizarán a la memoria principal, de modo que los datos de la memoria principal Debe ser el último. Más importante aún, la reorganización desordenada está deshabilitada y la escritura de valores en la memoria está garantizada, de modo que se puede garantizar la visibilidad.

Método de sincronización sincronizada:

El método de sincronización solo afecta al método de sincronización que bloquea el mismo objeto de bloqueo. No afecta a otros subprocesos llamar a métodos asincrónicos o llamar a otros métodos de sincronización de recursos de bloqueo.

  1. Cuando se sincroniza la palabra clave sincronizada, el hilo en espera no se puede controlar y solo puede morir.

  2. Cuando se sincroniza la palabra clave sincronizada, no se garantiza la equidad, por lo que habrá subprocesos en la cola.

synchronized Declarar métodos         con palabras clave  tiene inconvenientes en algunos casos. Por ejemplo, si el hilo A llama a un método sincrónico para realizar una tarea más larga, el hilo B debe esperar más tiempo. En este caso, puede intentar utilizar  synchronized bloques de código síncronos para resolver el problema.

Bloque de código de sincronización sincronizado:

  La granularidad de sincronización del bloque de código de sincronización es más detallada, que es el método de programación recomendado en desarrollo. Puede ubicar la ubicación de sincronización específica en lugar de simplemente implementar la lógica de sincronización del método como un todo. En términos de eficiencia, es relativamente mayor.

  Envuelva los bloques de código que deben sincronizarse y tenga cuidado de no colocar operaciones que consuman mucho tiempo en los bloques de código sincronizados. Como salida de impresión, operación de E / S, etc.

Función de palabra clave volátil

Volatile garantiza la visibilidad de los datos de la memoria y no puede garantizar el funcionamiento atómico de los datos de la memoria.

El papel de la palabra clave sincronizada

Synchronized garantiza la visibilidad de los datos de la memoria y también garantiza el funcionamiento atómico de los datos de la memoria.

 

Supongo que te gusta

Origin blog.csdn.net/Growing_hacker/article/details/109098523
Recomendado
Clasificación