Directorio de artículos
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. synchronized
El bloqueo integrado realizado por palabras clave se puede utilizar directamente en un caso independiente .
Cada Java
objeto 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. Java
El bloqueo incorporado es un bloqueo mutex, lo que significa que como máximo solo un subproceso puede adquirir el bloqueo. Cuando el subproceso A
intenta adquirir B
el bloqueo incorporado mantenido por el subproceso, el subproceso A
debe esperar o bloquear hasta que el subproceso B
libere el Si el hilo B
no se libera Con este bloqueo, el hilo A
esperará para siempre.
Java
Los 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 class
objetos de clases . Sabemos que puede haber muchos objetos de instancia de una clase, pero cada clase tiene solo un class
objeto, 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 .
synchronized
Es solo un mecanismo de bloqueo para bloqueos integrados. Cuando se agrega una synchronized
palabra 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 Test
el 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 Test
el 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 Test
el objeto no está bloqueado, lo que significa que Test
otros synchronized
mé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 synchronized
el 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 class
objetos de la clase actual , porque cada clase tiene un solo class
objeto, 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!");
}
}
}