Синхронизованный метод бывает двух типов - статический и нестатитический. Статический эквивалентен синхронизации тела метода на классе:
public synchronized static void method() {
}
class C {
public static void method() {
synchronized (C.class) {
}
}
}
Второй эквивалентен синхронизации тела метода на this :
public synchronized void method() {
}
public void method() {
synchronized (this) {
}
}
Различия, кажется, очевидны - при синхронизации на объекте вы можете выбрать этот самый объект, на котором надо синхронизоваться. Плюс вы можете выбрать какой именно кусок кода синхронизовать - и его надо минимизировать для ускорения.