Ответ
synchronized внутри метода использует экземпляр объекта (this) в качестве монитора для нестатических методов и класс (Class object) для статических.
Пример:
public class Example {
// Монитор — this (экземпляр Example)
public synchronized void nonStaticMethod() { ... }
// Монитор — Example.class (Class-объект)
public static synchronized void staticMethod() { ... }
}
Нюансы:
-
Для
synchronizedблоков можно явно указать монитор:synchronized (lockObject) { ... } -
Использование
thisможет привести к deadlock, если разные потоки блокируют один объект. Лучше использовать отдельныеfinal-объекты для блокировки.