Ответ
Использование синхронизированного блока (synchronized(object) { ... }) вместо синхронизированного метода (public synchronized void method()) дает больше гибкости и может повысить производительность.
Ключевые преимущества синхронизированного блока:
- Тонкая настройка блокировки (Fine-grained locking): Блокируется только критическая секция кода, а не весь метод. Остальной код метода может выполняться параллельно.
- Контроль над объектом-монитором: Можно использовать отдельный, приватный объект для блокировки вместо блокировки всего экземпляра класса (
this). Это уменьшает contention (конкуренцию) между потоками. - Повышение производительности: Меньший объем синхронизированного кода сокращает время, в течение которого потоки ожидают друг друга.
Пример:
public class Counter {
private int count = 0;
private final Object lock = new Object(); // Специальный объект для блокировки
public void increment() {
// Несинхронизированная операция (например, логирование)
System.out.println("Подготовка к инкременту");
synchronized (lock) { // Блокируется только объект 'lock', а не весь 'this'
// Критическая секция
count++;
}
// Дальнейший несинхронизированный код
}
}
Когда использовать метод? Синхронизированный метод уместен, когда весь метод является критической секцией и достаточно блокировки на экземпляре (this) или классе (для статических методов).