Получить доступ

Что обеспечивает ключевое слово synchronized?

JuniorМногопоточность
Ещё спрашивают так:
  • Что такое монитор в Java?
  • Чем synchronized метод отличается от synchronized блока?
  • Зачем нужна синхронизация потоков?
Коротко

synchronized даёт взаимное исключение (один поток в блоке по данному монитору) и видимость изменений для следующего вошедшего.

  • Блокировка привязана к объекту-монитору: метод экземпляра — this, static — класс
  • Разные мониторы друг другу не мешают

А ещё Монитор реентерабелен: поток может войти повторно; освобождается автоматически при любом выходе

Так подсказку видит пользователь sotto на живом собеседовании — за пару секунд, пока вы думаете вслух.

Подробно

У каждого объекта в Java есть монитор. synchronized захватывает его: пока один поток внутри блока, другие, пытающиеся войти по тому же монитору, ждут.

Две гарантии, обе важны:

  1. Взаимное исключение — составная операция (прочитать, изменить, записать) выполняется целиком без вмешательства других потоков.
  2. Видимость — изменения, сделанные внутри блока, видны следующему потоку, который захватит тот же монитор. Без синхронизации поток может вообще не увидеть чужие изменения из-за кэшей и переупорядочивания.

На каком объекте блокировка:

  • synchronized метод экземпляра — на this;
  • static synchronized — на объекте класса;
  • блок synchronized (lock) { ... } — на указанном объекте; так можно сузить критическую секцию и использовать приватный объект-замок.

Типичная ошибка — защищать одни данные разными мониторами: два потока синхронизированы, но по разным объектам, и гонка остаётся.

Монитор реентерабелен и освобождается автоматически при любом выходе из блока, включая исключение. Дополнительно у монитора есть wait/notify для ожидания условий.

Пример

class Counter {
    private final Object lock = new Object();
    private int value;

    void increment() {
        synchronized (lock) { value++; }  // атомарно и видимо
    }
    int get() {
        synchronized (lock) { return value; }
    }
}

Что хотят услышать

  • Обе гарантии: взаимное исключение и видимость.
  • На каком объекте захватывается монитор в разных формах.
  • Ошибка с разными мониторами.
  • Реентерабельность и автоматическое освобождение — плюс.

Частые ошибки

  • Помнить только про взаимное исключение и забывать про видимость.
  • Синхронизироваться на разных объектах и считать код защищённым.

Проверьте себя

Один верный вариант. Подумайте, потом откройте ответ.

Показать варианты и ответ
  • ✓Взаимное исключение: в блок по одному монитору одновременно входит только один поток, и изменения становятся видимы следующему вошедшему
  • ✗Ускорение выполнения блока за счёт приоритета потока
  • ✗Гарантию, что блок выполнится без исключений
  • ✗Выполнение блока в отдельном потоке

Что спросят дальше

  • Что произойдёт при вызове одного синхронизированного метода из другого?
  • На каких объектах не стоит синхронизироваться?

Разбор темы

Связанные вопросы

Закрытая бета

Подсказки на собеседовании — в реальном времени

sotto слышит вопрос интервьюера и показывает короткий ответ и план, как в блоке «Коротко». Оставьте контакт — пришлём доступ и промокод.

  • Промокод на 2 часа — сверх пробных 30 минут
  • Программа для Windows — скачать сразу, войти — через Яндекс ID или VK ID
  • Прямая связь с разработчиком: что улучшить — сделаем