Ответ
synchronized — это механизм синхронизации (взаимного исключения), который гарантирует, что только один поток в данный момент может выполнять критическую секцию кода или метод, защищённый этим модификатором. Он предотвращает состояние гонки (race condition) и обеспечивает согласованность данных.
Как работает: Каждый объект в Java имеет связанный с ним монитор (intrinsic lock). Ключевое слово synchronized захватывает этот монитор для текущего потока, блокируя доступ другим потокам.
Способы использования:
- Синхронизированный метод: Захватывает монитор объекта (
this).public synchronized void increment() { count++; // Потокобезопасная операция } - Синхронизированный блок: Захватывает монитор указанного объекта, что даёт более гибкое и мелкозернистое управление.
public void addItem(String item) { synchronized(lockObject) { list.add(item); // Синхронизация только на время добавления } }
Проблемы и альтернативы:
- Deadlock: Риск взаимной блокировки потоков.
- Производительность: Излишняя синхронизация может снизить параллелизм.
- Современные альтернативы:
java.util.concurrent.locks.ReentrantLock(более гибкие возможности).Atomic-классы (AtomicInteger,AtomicReference) для атомарных операций.- Потокобезопасные коллекции из
java.util.concurrent.
В Kotlin аналогичную функциональность предоставляет функция synchronized() или аннотация @Synchronized.