Si tiene algunos métodos que no están sincronizados y están accediendo y cambiando las variables de instancia. En tu ejemplo:
private int a;
private int b;
cualquier cantidad de subprocesos puede acceder a estos métodos no sincronizados al mismo tiempo cuando otro subproceso está en el método sincronizado del mismo objeto y puede realizar cambios en las variables de instancia. Por ejemplo: -
public void changeState() {
a++;
b++;
}
Debe evitar el escenario de que los métodos no sincronizados están accediendo a las variables de instancia y cambiándolas; de lo contrario, no tiene sentido utilizar métodos sincronizados.
En el siguiente escenario: -
class X {
private int a;
private int b;
public synchronized void addA(){
a++;
}
public synchronized void addB(){
b++;
}
public void changeState() {
a++;
b++;
}
}
Solo uno de los hilos puede estar en el método addA o addB, pero al mismo tiempo, cualquier número de hilos puede ingresar al método changeState. No hay dos subprocesos que puedan ingresar addA y addB al mismo tiempo (debido al bloqueo de nivel de objeto), pero al mismo tiempo cualquier cantidad de subprocesos puede ingresar changeState.
synchronized (this)
bloque 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.