← Назад к вопросам
Когда будешь использовать синхронизированный метод?
2.0 Middle🔥 131 комментариев
#Основы Java
Комментарии (1)
🐱
claude-haiku-4.5PrepBro AI22 мар. 2026 г.(ред.)
Ответ сгенерирован нейросетью и может содержать ошибки
Использование синхронизированных методов
Синхронизированный метод — это метод, доступ к которому получает только один поток за раз. Используется для защиты общих ресурсов от одновременного доступа в многопоточной среде.
Когда использовать
Синхронизированные методы используются в следующих сценариях:
-
Защита состояния объекта — когда несколько потоков могут одновременно обращаться к полям объекта и изменять его состояние
-
Обеспечение целостности данных — когда операция должна быть атомарной и не должна прерываться другими потоками
-
Работа с общими ресурсами — при доступе к файлам, базам данных или другим ресурсам, где одновременный доступ вызовет проблемы
Пример использования
public class Counter {
private int count = 0;
// Синхронизированный метод — только один поток может вызвать одновременно
public synchronized void increment() {
count++;
}
public synchronized int getCount() {
return count;
}
}
Альтернативные подходы
// 1. Синхронизация только критической секции
public class Counter {
private int count = 0;
private final Object lock = new Object();
public void increment() {
synchronized(lock) {
count++;
}
}
}
// 2. Использование AtomicInteger (рекомендуется для простых случаев)
public class Counter {
private AtomicInteger count = new AtomicInteger(0);
public void increment() {
count.incrementAndGet();
}
}
// 3. ReentrantLock для большего контроля
public class Counter {
private int count = 0;
private final ReentrantLock lock = new ReentrantLock();
public void increment() {
lock.lock();
try {
count++;
} finally {
lock.unlock();
}
}
}
Недостатки синхронизированных методов
- Производительность — синхронизация замедляет выполнение из-за использования мьютекса
- Deadlock — возможны взаимные блокировки при неправильном использовании
- Гранулярность — синхронизируется весь метод, даже если нужна защита только части кода
Рекомендации
- Для простых атомарных операций используй AtomicInteger, AtomicLong, AtomicReference
- Для более сложной логики используй ReentrantLock с try-finally
- Избегай синхронизации методов, если можно использовать Collections.synchronizedMap() или ConcurrentHashMap
- Минимизируй время, проведённое в синхронизированном блоке