Если у вас есть несколько методов, которые не синхронизированы и обращаются к переменным экземпляра и изменяют их.В вашем примере:
private int a;
private int b;
любое количество потоков может обращаться к этим несинхронизированным методам одновременно, когда другой поток находится в синхронизированном методе того же объекта и может вносить изменения в переменные экземпляра.Например: -
public void changeState() {
a++;
b++;
}
Необходимо избегать сценария, когда несинхронизированные методы обращаются к переменным экземпляра и изменяют его, иначе нет смысла использовать синхронизированные методы.
Сценарий: -
class X {
private int a;
private int b;
public synchronized void addA(){
a++;
}
public synchronized void addB(){
b++;
}
public void changeState() {
a++;
b++;
}
}
Только один из потоков может быть в методе addA или addB, но в то же время любое количество потоков может войти в метод changeState.Никакие два потока не могут одновременно войти в addA и addB (из-за блокировки на уровне объекта), но в то же время любое количество потоков может войти в changeState.