Ответ
Ключевое слово synchronized используется для синхронизации доступа к общим ресурсам в многопоточных приложениях, предотвращая состояние гонки (race condition).
Основные способы применения:
-
Синхронизированный метод:
public synchronized void incrementCounter() { counter++; }- Для нестатического метода блокировка происходит на объекте (
this). - Для статического метода блокировка происходит на объекте класса (
Class).
- Для нестатического метода блокировка происходит на объекте (
-
Синхронизированный блок:
public void incrementCounter() { synchronized(this) { // или любой другой объект-монитор counter++; } }- Позволяет синхронизировать только критическую секцию кода, что повышает производительность.
-
Синхронизация на уровне класса:
synchronized(MyClass.class) { // Критическая секция, работающая со статическими данными }
Проблемы и альтернативы:
- Deadlock: Может возникнуть, если потоки блокируют мониторы в разном порядке.
- Производительность: Избыточная синхронизация снижает параллелизм.
- Современные альтернативы: Для сложных сценариев предпочтительнее использовать классы из
java.util.concurrent:ReentrantLockдля гибкой блокировки.AtomicIntegerи другие атомарные классы для простых операций.ConcurrentHashMapдля потокобезопасных коллекций.