¿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 en qué se diferencia el código anterior de este:
synchronized(this) {
//is all objects of MyClass are thread-safe now ??
}
java
multithreading
synchronization
locking
synchronized
Andrew Tobilko
fuente
fuente
Respuestas:
El fragmento
synchronized(X.class)
usa la instancia de la clase como monitor. Como solo hay una instancia de clase (el objeto que representa los metadatos de la clase en tiempo de ejecución), un hilo puede estar en este bloque.Con
synchronized(this)
el bloque está protegido por la instancia. En cada caso, solo un hilo puede entrar en el bloque.synchronized(X.class)
se utiliza para asegurarse de que haya exactamente un hilo en el bloque.synchronized(this)
asegura que haya 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 mutar, solo el estado de la instanciasynchronized(this)
es suficiente.fuente
Para agregar a las otras respuestas:
es equivalente a
y
es equivalente a
fuente
synchronized
bloques. Eso los hace equivalentes. Si cambia un ejemplo, de hecho ya no es el mismo.No, el primero obtendrá un bloqueo en la definición de clase de
MyClass
, no en todas las instancias. Sin embargo, si se usa en una instancia, esto bloqueará efectivamente todas las demás instancias, ya que comparten una sola definición de clase.El segundo obtendrá un bloqueo solo en la instancia actual.
En cuanto a si esto hace que sus objetos sean seguros para subprocesos, esa es una pregunta mucho más compleja: ¡necesitaríamos ver su código!
fuente
Sí, lo hará (en cualquier función / bloque sincronizado).
Estuve preguntándome sobre esta pregunta durante un par de días para mí (en realidad, en kotlin). Finalmente encontré una buena explicación y quiero compartirla:
El bloqueo de nivel de clase evita que varios subprocesos entren en un bloque sincronizado en cualquiera de todas las instancias disponibles de la clase en tiempo de ejecución. Esto significa que si en tiempo de ejecución hay 100 instancias de DemoClass, entonces solo un hilo podrá ejecutar demoMethod () en cualquiera de las instancias a la vez, y todas las demás instancias se bloquearán para otros hilos.
El bloqueo de nivel de clase siempre debe realizarse para que los subprocesos de datos estáticos sean seguros. Como sabemos que la palabra clave estática asocia datos de métodos a nivel de clase, utilice el bloqueo en campos o métodos estáticos para hacerlo a nivel de clase.
Además de notar por qué .class . Es solo porque
.class
es equivalente a cualquier variable estática de clase similar a:donde el nombre de la variable de bloqueo es clase y el tipo es Clase <T>
Leer más: https://howtodoinjava.com/java/multi-threading/object-vs-class-level-locking/
fuente