Ответ
Ключевое слово synchronized обеспечивает синхронизацию по монитору (внутреннему замку) объекта.
Правила:
- Нестатический synchronized-метод блокирует монитор объекта
this, на котором вызван метод. - Статический synchronized-метод блокирует монитор объекта класса (
ClassName.class). - Synchronized-блок позволяет явно указать объект-монитор.
Примеры:
public class Counter {
private int count = 0;
private final Object customLock = new Object();
// Синхронизация по монитору объекта 'this'
public synchronized void increment() {
count++;
}
// Синхронизация по монитору класса Counter.class
public static synchronized void staticMethod() {
// ...
}
// Синхронизация по произвольному объекту
public void decrement() {
synchronized (customLock) {
count--;
}
}
}
Важно: Для корректной взаимной блокировки все конкурирующие потоки должны использовать один и тот же объект-монитор.