Java utiliza sincronizados para implementar bloqueos integrados


Múltiples procesos o subprocesos que acceden al mismo recurso al mismo tiempo (o en el mismo período de tiempo) causarán problemas de concurrencia (seguridad de subprocesos). Los bloqueos se pueden utilizar para resolver problemas de simultaneidad. synchronizedEl bloqueo integrado realizado por palabras clave se puede utilizar directamente en un caso independiente .

Cada Javaobjeto se puede utilizar como bloqueo para la sincronización, estos bloqueos se denominan bloqueos integrados. Cuando un hilo ingresa a un método o bloque de código sincronizado, automáticamente adquirirá el bloqueo, y cuando sale de un método o bloque de código sincronizado, lo liberará. La única forma de obtener un candado incorporado es ingresar al bloque de código sincronizado o al método protegido por este candado. JavaEl bloqueo incorporado es un bloqueo mutex, lo que significa que como máximo solo un subproceso puede adquirir el bloqueo. Cuando el subproceso Aintenta adquirir Bel bloqueo incorporado mantenido por el subproceso, el subproceso Adebe esperar o bloquear hasta que el subproceso Blibere el Si el hilo Bno se libera Con este bloqueo, el hilo Aesperará para siempre.

JavaLos bloqueos integrados se pueden dividir básicamente en bloqueos de objetos y bloqueos de clases . Los bloqueos de objetos se utilizan para métodos de instancia de objeto o instancias de objeto, y los bloqueos de clase se utilizan para métodos estáticos de clases u classobjetos de clases . Sabemos que puede haber muchos objetos de instancia de una clase, pero cada clase tiene solo un classobjeto, por lo que los bloqueos de objetos de diferentes instancias de objetos no interfieren entre sí, pero cada clase tiene solo un bloqueo de clase. Una cosa que debe tenerse en cuenta es que, de hecho, el bloqueo de clase es solo una cosa conceptual, no real, solo se usa para ayudarnos a comprender la diferencia entre los métodos de instancia de bloqueo y los métodos estáticos .

synchronizedEs solo un mecanismo de bloqueo para bloqueos integrados. Cuando se agrega una synchronizedpalabra clave a un método , indica que el bloqueo integrado debe adquirirse antes de que pueda ejecutarse y no puede evitar que otros subprocesos accedan a métodos que no lo hacen. Necesita adquirir la cerradura incorporada.

1. Bloqueo de objetos

1.1. Método de sincronización

El método de sincronización es bloquear el objeto, y otros subprocesos no podrán acceder a los métodos y bloques de código que necesitan adquirir el bloqueo del objeto .

public class Test{
    
    
    
    public synchronized void print(){
    
        
        System.out.println("hello world!");
    }
    
}

El código anterior indica que el print()método de acceso necesita adquirir Testel bloqueo del objeto de instancia.

1.2. Bloque de código de sincronización (bloqueo de objeto de clase actual)

Bloque de código de sincronización, esta forma de escritura también bloquea el objeto de instancia de esta clase, y el 1.1.efecto es el mismo, otros subprocesos no podrán acceder al método y bloque de código que necesitan adquirir el bloqueo del objeto .

public class Test{
    
    
    
    public void print(){
    
        
        synchronized(this){
    
    
            System.out.println("hello world!");
        }
    }
    
}

El código anterior indica print()que el bloque de código en el método de acceso necesita adquirir Testel bloqueo del objeto de instancia.

1.3. Bloque de código de sincronización (pasando el bloqueo de objeto de clase)

Bloque de código síncrono, esta forma de escritura bloquea el objeto entrante y no afecta el acceso al método y bloque de código que necesita adquirir el bloqueo de objeto de clase actual.

public class Test{
    
    
    
    private byte[] lock = new byte[0];
    
    public void print(){
    
        
        synchronized(lock){
    
    
            System.out.println("hello world!");
        }
    }
    
    public synchronized void print1(){
    
    
        System.out.println("123456");
    }
    
}

print()El bloque de código sincronizado en el método de ejecución bloqueará el byte[]objeto lock. Tenga en cuenta que Testel objeto no está bloqueado, lo que significa que Testotros synchronizedmétodos y bloques de código del objeto no print()se bloquearán debido a él. print1()Se puede acceder al método normalmente.

2. Bloqueo de clase

El efecto del método de modificación y el bloque de código del bloqueo de clase es el mismo que el del bloqueo de objeto, porque el bloqueo de clase es solo un concepto abstracto, y el bloqueo de clase y el bloqueo de objeto no interfieren entre sí. Del mismo modo, cuando un hilo obtiene un bloqueo de objeto, también puede obtener este tipo de bloqueo, es decir, obtener dos bloqueos al mismo tiempo, lo cual está permitido.

2.1. Métodos estáticos síncronos

Dado que los métodos estáticos son compartidos por todas las instancias de objetos y synchronizedel bloqueo correspondiente al método estático modificado también es único, se abstrae un bloqueo de clase. Otros subprocesos no podrán acceder a la necesidad de obtener los métodos de bloqueo de clase y los bloques de código.

public class Test{
    
    
    
    public synchronized static void print(){
    
        
        System.out.println("hello world!");
    }
    
}

2.2. Bloque de código síncrono (bloqueo de clase actual)

Esta forma de escribir bloquea directamente los classobjetos de la clase actual , porque cada clase tiene un solo classobjeto, que 2.1.tiene el mismo efecto. Otros subprocesos no podrán acceder a la necesidad de obtener los métodos de bloqueo de clase y los bloques de código.

public class Test{
    
    
    
    public void print(){
    
        
        synchronized(Test.class){
    
    
            System.out.println("hello world!");
        }
    }
    
}

Supongo que te gusta

Origin blog.csdn.net/wb1046329430/article/details/115259802
Recomendado
Clasificación