lock - Bloque sincronizado de Java para.class
synchronized java (3)
El fragmento synchronized(X.class)
usa la instancia de clase como monitor. Como solo hay una instancia de clase (el objeto que representa los metadatos de clase en tiempo de ejecución), un hilo puede estar en este bloque.
Con synchronized(this)
el bloque está protegido por la instancia. Para cada instancia, solo un hilo puede ingresar al bloque.
synchronized(X.class)
se usa para asegurarse de que haya exactamente un Thread en el bloque. synchronized(this)
asegura que hay exactamente un hilo por instancia. Si esto hace que el código real en el bloque sea seguro para subprocesos, depende de la implementación. Si mute solo el estado de la instancia synchronized(this)
es suficiente.
¿Qué significa este código Java? ¿Ganará bloqueo en todos los objetos de MyClass
?
synchronized(MyClass.class) {
//is all objects of MyClass are thread-safe now ??
}
Y cómo el código anterior difiere de este:
synchronized(this) {
//is all objects of MyClass are thread-safe now ??
}
No, el primero obtendrá un bloqueo en la definición de la clase de MyClass
, no todas las instancias de la misma. Sin embargo, si se usa en una instancia, esto efectivamente bloqueará todas las demás instancias, ya que comparten una única definición de clase.
El segundo obtendrá un bloqueo en la instancia actual solamente.
En cuanto a si esto hace que tus objetos se mantengan seguros, esa es una pregunta mucho más compleja: ¡necesitaríamos ver tu código!
Para agregar a las otras respuestas:
static void myMethod() {
synchronized(MyClass.class) {
//code
}
}
es equivalente a
static synchronized void myMethod() {
//code
}
y
void myMethod() {
synchronized(this) {
//code
}
}
es equivalente a
synchronized void myMethod() {
//code
}