Si tengo 2 métodos sincronizados en la misma clase, pero cada uno accediendo a diferentes variables, ¿pueden 2 subprocesos acceder a esos 2 métodos al mismo tiempo? ¿Se produce el bloqueo en el objeto, o es tan específico como las variables dentro del método sincronizado?¿Bloqueo de método sincronizado de Java en objeto o método?
Ejemplo:
class X {
private int a;
private int b;
public synchronized void addA(){
a++;
}
public synchronized void addB(){
b++;
}
}
Can 2 hilos de acceso a la misma instancia de la clase X realizar x.addA(
) y x.addB()
al mismo tiempo?
* Si sincroniza el método, bloquea el objeto completo, por lo que dos subprocesos que accedan a una variable diferente de este mismo objeto se bloquearían entre sí de todos modos. * Eso es un poco engañoso. La sincronización en el método es funcionalmente equivalente a tener un bloque 'synchronized (this)' alrededor del cuerpo del método. El objeto "this" no se bloquea, sino que el objeto "this" se usa como mutex y se impide que el cuerpo se ejecute simultáneamente con otras secciones de código también sincronizadas en "this". No tiene ningún efecto en otros campos/métodos de "esto" que no están sincronizados. –
Sí, es realmente engañoso. Para un ejemplo real - Mira esto - http://stackoverflow.com/questions/14447095/does-java-monitor-include-instance-variables - Resumen: el bloqueo está solo en el nivel de método sincronizado y las variables de instancia del objeto pueden ser accedidas por otro thread – mac
El primer ejemplo está fundamentalmente roto. Si 'a' y' b' son objetos, p. 'Entero's, estabas sincronizando en las instancias * reemplazando con diferentes objetos * cuando aplicabas el operador' ++ '. – Holger