Uso de la palabra clave sincronizada en subprocesos múltiples de Java
Dado que varios subprocesos en el mismo proceso comparten espacio de memoria, que es una instancia compartida en Java, se producirán conflictos cuando varios subprocesos intenten modificar el contenido de una instancia al mismo tiempo, por lo que los subprocesos deben implementar compartido exclusión mutua para sincronizar varios subprocesos
La sincronización más simple es marcar un método como sincronizado. Para la misma instancia, solo se puede ejecutar un método sincronizado en cualquier momento. Cuando se ejecuta un método. , si otros subprocesos desean ejecutar cualquier método sincronizado de esta instancia, deben esperar a que el subproceso que actualmente ejecuta el método sincronizado salga de este método antes de poder ejecutarlo en secuencia
Sin embargo, los métodos no sincronizados sí no se ve afectado. ¿Hay algún método sincronizado actualmente en ejecución? Los métodos no sincronizados pueden ser ejecutados por múltiples subprocesos al mismo tiempo
Además, debe tenerse en cuenta que solo se pueden ejecutar métodos sincronizados de la misma instancia. ejecutado por un subproceso al mismo tiempo. Los métodos sincronizados de diferentes instancias se pueden ejecutar simultáneamente. Por ejemplo, la clase A define el método sincronizado sync(), luego dos subprocesos pueden ejecutar diferentes instancias, una sincronización() y una sincronización(). al mismo tiempo
La implementación de la sincronización de múltiples subprocesos se basa en última instancia en el mecanismo de bloqueo. Podemos imaginar que un recurso compartido es una sala y cada persona es un subproceso cuando A quiere ingresar a la sala. , debe obtener la cerradura de la puerta. Una vez que A obtiene la cerradura de la puerta, inmediatamente cierra la puerta después de entrar, por lo que B, C y D tienen que esperar afuera de la puerta hasta que A después de que se abre la cerradura, alguien en B, C, y D agarra la cerradura (el método de agarre específico depende de la implementación de la JVM, puede ser por orden de llegada o seleccionado al azar) y luego ingresa a la casa y cierra la puerta para que como máximo una persona esté en la casa en cualquier momento. tiempo (usando ***recursos compartidos)
La especificación del lenguaje Java tiene soporte integrado para subprocesos múltiples. Para los programas Java, cada instancia de objeto tiene un bloqueo una vez. El hilo obtiene Si otro hilo quiere obtener el bloqueo, solo puede esperar a que este hilo libere el bloqueo. La única forma de obtener el bloqueo es la palabra clave sincronizada. Por ejemplo,
public class SharedResource {.
cuenta int privada = ;
cuenta int pública () { cuenta de retorno }
cuenta vacía sincronizada pública (cuenta int) { unt = cuenta }
}
El método sincronizado público sincronizado void setCount (int count) { unt = count } es en realidad equivalente a
public void setCount (int count) {
sincronizado (this) { // Obtenga este bloqueo aquí
unt = count;
} // Libere este bloqueo aquí
}
Rojo Esta parte representa el segmento de código que necesita sincronizarse. Esta área es un área peligrosa. Si se ejecutan más de dos subprocesos al mismo tiempo, se producirá un conflicto. estado interno de SharedResource, primero debe obtener el bloqueo de la instancia de SharedResource
Salir s
Cuando se produce un bloqueo sincronizado, el bloqueo propiedad del subproceso se libera automáticamente, de modo que otros subprocesos puedan adquirir el bloqueo nuevamente
Para mejorar el rendimiento, no es necesario bloquear esto. Por ejemplo, SharedResource. tiene dos variables que cambian de forma independiente
public class SharedResouce {
private int a =
private int b =
public sincronizado; void setA (int a) { this a = a }
void setB público sincronizado (int b) { this b = b }
}
Si todo el método está sincronizado, setA() no puede ser setB() ) no puede setA() cuando setB() Para mejorar el rendimiento, puede utilizar bloqueos de diferentes objetos
public class SharedResouce { <. /p>
privado int a =;
privado int b =
Objeto privado sync_a = nuevo Objeto()
Objeto privado sync_b = nuevo Objeto()
public void setA(int a) {
p>
sincronizado (sync_a) {
this a = a; >
}
}
público sincronizado void setB( int b) {
sincronizado (sync_b) {
este b = b;
} lishixinzhi/Article/program/Java/gj/201311/27512