Java multithreading - bloques sincrónicos
El bloque sincronizado Java se usa para marcar el método o bloque de código que está sincronizado. Los bloques de sincronización Java se utilizan para evitar la competencia. Este artículo presenta el siguiente contenido:
Palabras clave sincronizadas Java (sincronizadas)
Los bloques sincronizados en Java están marcados sincronizados. Los bloques de sincronización se sincronizan en un objeto en Java. Todos los bloques de sincronización sincronizados en un objeto solo pueden ingresarse mediante un hilo y realizar operaciones al mismo tiempo. Todos los demás subprocesos que esperan para ingresar al bloque de sincronización se bloquearán hasta que se ejecuten los subprocesos en el bloque de sincronización.
Hay cuatro bloques de sincronización diferentes:
Los bloques de sincronización anteriores están sincronizados en diferentes objetos. Qué bloque de sincronización realmente se necesita depende de la situación específica.
Sincronización del método de instancia
Aquí hay un método de ejemplo sincronizado:
public sincronizado void add (int value) {this.count += value; }
Sincronización del método estático
La sincronización del método estático es la misma que el método de sincronización del método de instancia, y también se usa la palabra clave sincronizada. La sincronización del método estático de Java es la siguiente:
public static sincronizado void add (int value) {count += value; }Del mismo modo, la palabra clave sincronizada aquí le dice a Java que este método está sincronizado.
La sincronización de los métodos estáticos se refiere a la sincronización en el objeto de clase donde se encuentra el método. Debido a que una clase solo puede corresponder a un objeto de clase en una máquina virtual Java, solo se permite que un hilo ejecute métodos de sincronización estática en la misma clase.
Para los métodos de sincronización estática en diferentes clases, un hilo puede ejecutar métodos de sincronización estática en cada clase sin esperar. Independientemente del método de sincronización estática en la clase que se llama, una clase solo puede ser ejecutada por un hilo al mismo tiempo.
Bloques sincrónicos en métodos de caso
A veces no necesita sincronizar todo el método, sino sincronizar parte del método. Java puede sincronizar parte de un método.
A continuación se muestra un ejemplo de un bloque de sincronización en un método Java asincrónico:
public void add (int value) {sincronizado (this) {this.count += value; }}Ejemplos Use el constructor de bloques sincrónicos Java para marcar una pieza de código que está sincronizada. Este código es el mismo que el método de sincronización cuando se ejecuta.
Tenga en cuenta que el constructor de bloque síncrono Java encierra el objeto en los soportes. En el ejemplo anterior, se usa "esto", es decir, la instancia en sí que llama al método ADD. Los objetos encerrados en los soportes en el constructor de sincronización se denominan objetos de monitor. El código anterior utiliza la sincronización del objeto de monitor, y el método de instancia sincrónica utiliza la instancia del método de llamada en sí como el objeto monitor.
Solo un hilo puede ejecutar en métodos Java sincronizados con el mismo objeto de monitor a la vez.
Los siguientes dos ejemplos sincronizan el objeto de instancia que llaman, por lo que son equivalentes en el efecto de ejecución sincronizado.
clase pública myClass {public sincronizado void log1 (string msg1, string msg2) {log.writeLn (msg1); log.writeln (msg2); } public void log2 (string msg1, string msg2) {sincronizado (this) {log.writeLn (msg1); log.writeln (msg2); }}}En el ejemplo anterior, solo se puede ejecutar un hilo en cualquiera de los dos bloques de sincronización a la vez.
Si el segundo bloque de sincronización no se sincroniza en este objeto de instancia, los dos métodos pueden ser ejecutados simultáneamente por el hilo.
Bloques sincrónicos en métodos estáticos
Similar a lo anterior, los siguientes son ejemplos de dos métodos de sincronización de métodos estáticos. Estos métodos se sincronizan en el objeto de clase al que pertenece el método.
clase pública myClass {public static sincronizado void log1 (string msg1, string msg2) {log.writeLn (msg1); log.writeln (msg2); } public static void log2 (String msg1, string msg2) {sincronizado (myclass.class) {log.writeLn (msg1); log.writeln (msg2); }}}Estos dos métodos no permiten el acceso por subprocesos al mismo tiempo.
Si el segundo bloque de sincronización no se sincroniza en el objeto MyClass.Class. Luego, se puede acceder a estos dos métodos mediante hilos al mismo tiempo.
Instancia de sincronización de Java
En el siguiente ejemplo, se inician dos hilos, ambos llamando al método Agregar de la misma instancia de la clase de contador. Debido a que la sincronización está en la instancia a la que pertenece el método, solo un hilo puede acceder al método al mismo tiempo.
Contador de clase pública {Long Count = 0; public sincronizado void add (valor largo) {this.count += valor; }} public class Counthread extiende el hilo {contador protegido de contador = nulo; Public Counterthread (contador de contador) {this.count = contador; } public void run () {for (int i = 0; i <10; i ++) {contador.add (i); }}} Ejemplo de clase pública {public static void main (string [] args) {contador = new contador (); Thread ThreadA = new Counthread (contador); Thread Threadb = new Counthread (contador); thinda.start (); Threadb.Start (); }}Se crearon dos hilos. Su constructor se refiere a la misma instancia de contador. El método contador. Add se sincroniza en una instancia porque el método Agregar es un método de instancia y está marcado con la palabra clave sincronizada. Por lo tanto, solo un hilo puede llamar al método a la vez. Otro hilo debe esperar hasta que el primer hilo salga del método add () antes de continuar ejecutando el método.
Si dos hilos se refieren a dos instancias de mostrador diferentes, pueden llamar al método add () al mismo tiempo. Estos métodos llaman objetos diferentes, por lo que estos métodos se sincronizan en diferentes objetos. Estas llamadas de método no serán bloqueadas. Como se muestra en el siguiente ejemplo:
Ejemplo de clase pública {public static void main (string [] args) {contunare = new contar (); Contador de contador = nuevo contador (); Thread ThreadA = new Counthread (contraa); Thread Threadb = new Counthread (Counterb); thinda.start (); Threadb.Start (); }}Tenga en cuenta que estos dos hilos, Thread y ThreadB, ya no se refieren a la misma instancia de contador. Los métodos ADD de contraga y contrab se sincronizan en el objeto al que pertenecen. Llamar al método ADD ADD no bloqueará la llamada al método ADD de Counterb.
Lo anterior es una explicación del conocimiento de los bloques de sincronización de múltiples subprocesos Java. Continuaremos agregando información relevante en el futuro. ¡Gracias por su apoyo para este sitio!