Ответ
Synchronized методы используются для обеспечения потокобезопасности при доступе к общим (разделяемым) ресурсам в многопоточной среде.
Основные сценарии применения:
- Изменение состояния объекта, доступного нескольким потокам (например, счетчика).
- Атомарные операции, которые не должны прерываться (check-then-act, read-modify-write).
- Работа с общими изменяемыми структурами данных (коллекциями, массивами).
Пример:
public class Counter {
private int value = 0;
// synchronized гарантирует, что только один поток выполнит инкремент за раз
public synchronized void increment() {
value++; // Операция не атомарна без синхронизации
}
public synchronized int getValue() {
return value;
}
}
Почему это работает? Ключевое слово synchronized устанавливает монитор (внутреннюю блокировку) на объект this (для нестатических методов) или на объект класса Class (для статических методов). Это предотвращает одновременное выполнение метода разными потоками.
Плюсы:
- Простота использования (встроено в язык).
- Гарантирует видимость изменений между потоками (решает проблему memory consistency).
Минусы и альтернативы:
- Снижение производительности из-за блокировок.
- Риск взаимоблокировок (deadlock).
- Для более сложных сценариев предпочтительнее использовать
java.util.concurrentпакет (например,ReentrantLock, атомарные классы, concurrent коллекции).