Java Concurrency 5: palabras clave sincronizadas y volátiles

Uno, sincronizado

Tome el sistema de llamadas virtuales como ejemplo

Cuando se utiliza el programa concurrente para llamar al número, habrá fenómenos como saltos de números, números repetidos y superación del valor máximo.

Consulte el modelo JMM, https://blog.csdn.net/qq_22059611/article/details/95211836

Se puede ver que debido a que los datos del espacio de trabajo no son visibles para otros subprocesos y la operación de aplausos no es una operación atómica, se producirá este tipo de problema.

Para resolver este problema, se introduce el concepto de bloqueo: cuando un subproceso opera con datos compartidos, otros subprocesos no pueden operar con los datos.

1. Conceptos relacionados

¿Por qué se puede lograr la sincronización mediante el uso de bloqueos?

El mecanismo de bloqueo tiene las siguientes dos características:

Exclusión mutua: es decir, solo un subproceso puede mantener un determinado objeto bloqueado al mismo tiempo. A través de esta característica, se realiza el mecanismo de coordinación en subprocesos múltiples, de modo que solo un subproceso se ejecuta en el bloque de código (operación compuesta) que debe sincronizarse al mismo tiempo. La exclusión mutua también suele denominarse atomicidad de las operaciones.

Visibilidad: se debe asegurar que antes de liberar el bloqueo, la modificación realizada en la variable compartida sea visible para otro subproceso que posteriormente adquiera el bloqueo (es decir, el valor de la última variable compartida debe obtenerse cuando se adquiere el bloqueo) , de lo contrario, otro subproceso. La incoherencia puede deberse a la continuación de la operación en una copia en caché local.

2. Uso de sincronización

A. Método de sincronización

(1) Métodos no estáticos sincronizados

Nombre de método de vacío sincronizado público () {

……

}

(2) método estático síncrono

Nombre de método de vacío estático sincronizado público () {

……

}

B. Bloque de código síncrono

sincronizado(este|objeto) {}
sincronizado(类.clase) {}
Objeto final privado MUTEX =nuevo Objeto();
Public void methodName(){    Sincronizado(MUTEX ){    …… } }



 

 

Clasificación según bloqueos adquiridos

1. Obtener el bloqueo de objetos

sincronizado(este|objeto) {}

Decorar métodos no estáticos

En Java, cada objeto tendrá un objeto monitor, que en realidad es el bloqueo del objeto Java, generalmente llamado "bloqueo integrado" o "bloqueo de objeto". Puede haber varios objetos de una clase, por lo que cada objeto tiene su propio bloqueo de objeto independiente sin interferir entre sí.

2. Obtener bloqueo de clase

sincronizado(类.clase) {}

Decorar métodos estáticos

En Java, también hay un bloqueo para cada clase, que puede denominarse "bloqueo de clase". El bloqueo de clase se implementa realmente a través de un bloqueo de objeto, es decir, el bloqueo de objeto de Clase de la clase. Solo hay un objeto Class por clase, por lo que solo hay un bloqueo de clase por clase.

Instrucciones de uso

En Java, cada objeto tendrá un objeto monitor, monitor.

1) Cuando un subproceso determinado posee este objeto, primero verifique si el contador del monitor es 0, si es 0 y ningún subproceso lo posee, entonces el subproceso posee este objeto en este momento y agrega 1 al monitor de este objeto ; si no es 0, significa que el hilo ya está ocupado por otro hilo, y este hilo espera. Cuando el hilo libera la posesión, monitor-1;

2) El mismo hilo puede bloquear el mismo objeto varias veces, +1, +1, reentrante

3. Análisis del principio sincronizado

 

 

 

dos. volátil

 

 

Supongo que te gusta

Origin blog.csdn.net/qq_22059611/article/details/103371573
Recomendado
Clasificación