Что такое synchronized в Android/Java?

«Что такое synchronized в Android/Java?» — вопрос из категории Other, который задают на 10% собеседований IOS Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

synchronized — это механизм синхронизации (взаимного исключения), который гарантирует, что только один поток в данный момент может выполнять критическую секцию кода или метод, защищённый этим модификатором. Он предотвращает состояние гонки (race condition) и обеспечивает согласованность данных.

Как работает: Каждый объект в Java имеет связанный с ним монитор (intrinsic lock). Ключевое слово synchronized захватывает этот монитор для текущего потока, блокируя доступ другим потокам.

Способы использования:

  1. Синхронизированный метод: Захватывает монитор объекта (this).
    public synchronized void increment() {
        count++; // Потокобезопасная операция
    }
  2. Синхронизированный блок: Захватывает монитор указанного объекта, что даёт более гибкое и мелкозернистое управление.
    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.