La documentación de Java dice:
No es posible que dos invocaciones de métodos sincronizados en el mismo objeto se intercalen.
¿Qué significa esto para un método estático? Dado que un método estático no tiene ningún objeto asociado, ¿se bloqueará la palabra clave sincronizada en la clase, en lugar del objeto?
this
es el bloqueo adquirido en los métodos de instancia), corríjalo Oscar.Solo para agregar un pequeño detalle a la respuesta de Oscar (¡agradablemente sucinta!), La sección relevante sobre la Especificación del lenguaje Java es 8.4.3.6, 'Métodos sincronizados' :
fuente
Un punto que debe tener cuidado (varios programadores generalmente caen en esa trampa) es que no existe un vínculo entre los métodos estáticos sincronizados y los métodos no estáticos sincronizados, es decir:
Principal:
Hilo 1:
Hilo 2:
f () yg () no están sincronizados entre sí y, por lo tanto, pueden ejecutarse de manera totalmente simultánea.
fuente
synchronized (MyClass.class) {...}
.A menos que implemente g () de la siguiente manera:
Este patrón también me resulta útil cuando quiero implementar la exclusión mutua entre diferentes instancias del objeto (que es necesario cuando se accede a un recurso externo, por ejemplo).
fuente
getClass()
devuelve el tipo de tiempo de ejecución ; si subclasifica la clase, la clase principal y la clase secundaria se sincronizarán en diferentes bloqueos.synchronized(MyClass.class)
es el camino a seguir si necesita asegurarse de que todas las instancias usen el mismo bloqueo.Eche un vistazo a la página de documentación de Oracle sobre bloqueos intrínsecos y sincronización
fuente
Un método estático también tiene un objeto asociado. Pertenece al archivo Class.class en el kit de herramientas JDK. Cuando el archivo .class se carga en la memoria RAM, Class.class crea una instancia llamada objeto de plantilla.
Por ejemplo: cuando intentas crear un objeto a partir de una clase de cliente existente como
La clase Customer.class se carga en la RAM. En ese momento Class.class en el kit de herramientas JDK crea un Objeto llamado objeto Template y carga ese Customer.class en ese objeto template. Los miembros estáticos de ese Customer.class se convierten en atributos y métodos en ese objeto template.
Entonces, un método o atributo estático también tiene un objeto
fuente
Los ejemplos a continuación brindan más claridad entre el bloqueo de clase y objeto, espero que el ejemplo a continuación ayude a otros también :)
Por ejemplo, tenemos los siguientes métodos: una clase de adquisición y otra bloqueo de objeto de adquisición:
Entonces, ahora podemos tener los siguientes escenarios:
Cuando los hilos que usan el mismo objeto intentan acceder al método
objLock
OR alstaticLock
mismo tiempo (es decir, ambos hilos intentan acceder al mismo método)Cuando los hilos que usan el mismo objeto intentan acceder
staticLock
yobjLock
métodos al mismo tiempo (intenta acceder a diferentes métodos)Cuando los hilos que utilizan objetos diferentes intentan acceder al
staticLock
métodoCuando los hilos que utilizan objetos diferentes intentan acceder al
objLock
métodofuente
Para aquellos que no están familiarizados, el método sincronizado estático bloqueado en el objeto de clase, por ejemplo, para la clase de cadena, su String.class, mientras que el método sincronizado de instancia se bloquea en la instancia actual de Object denotada por "esta" palabra clave en Java. Dado que ambos objetos son diferentes, tienen un bloqueo diferente, por lo que mientras un subproceso está ejecutando el método estático sincronizado, otro subproceso en Java no necesita esperar a que ese subproceso regrese, sino que adquirirá un bloqueo separado, el byte denotado .class literal y entrará en Método sincronizado estático.
fuente