Pregunta

¿Qué significa el código java? Va a 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 se diferencia de éste:

synchronized(this) {
   //is all objects of MyClass are thread-safe now ??
}
¿Fue útil?

Solución

El synchronized(X.class) fragmento utiliza la instancia de clase como un monitor. Como sólo hay una instancia de clase (el objeto que representa los metadatos clase en tiempo de ejecución) un hilo puede ser en este bloque.

Con synchronized(this) el bloque esté vigilado por la instancia. Para cada instancia sólo un hilo puede entrar en el bloque.

synchronized(X.class) se utiliza para asegurarse de que no es exactamente un hilo en el bloque. synchronized(this) asegura que no es exactamente un hilo por ejemplo. Si esto hace que el código real en el bloque de flujos seguros depende de la implementación. Si mutan único estado de la instancia synchronized(this) es suficiente.

Otros consejos

Para añadir 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
}

No, el primero será obtener un bloqueo en la definición de clase de MyClass, no todas las instancias de la misma. Sin embargo, si se utiliza en una instancia, esto bloqueará efectivamente todos los otros casos, ya que comparten una única definición de clase.

El segundo obtendrá un bloqueo en la instancia actual.

En cuanto a si esto hace que los objetos de hilo de seguridad, que es una cuestión mucho más compleja - tendríamos que ver el código

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top