Что обеспечивает ключевое слово synchronized?
- Что такое монитор в Java?
- Чем synchronized метод отличается от synchronized блока?
- Зачем нужна синхронизация потоков?
synchronized даёт взаимное исключение (один поток в блоке по данному монитору) и видимость изменений для следующего вошедшего.
- Блокировка привязана к объекту-монитору: метод экземпляра — this, static — класс
- Разные мониторы друг другу не мешают
А ещё Монитор реентерабелен: поток может войти повторно; освобождается автоматически при любом выходе
Подробно
У каждого объекта в Java есть монитор. synchronized захватывает его: пока один поток внутри блока, другие, пытающиеся войти по тому же монитору, ждут.
Две гарантии, обе важны:
- Взаимное исключение — составная операция (прочитать, изменить, записать) выполняется целиком без вмешательства других потоков.
- Видимость — изменения, сделанные внутри блока, видны следующему потоку, который захватит тот же монитор. Без синхронизации поток может вообще не увидеть чужие изменения из-за кэшей и переупорядочивания.
На каком объекте блокировка:
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; }
}
}Что хотят услышать
- Обе гарантии: взаимное исключение и видимость.
- На каком объекте захватывается монитор в разных формах.
- Ошибка с разными мониторами.
- Реентерабельность и автоматическое освобождение — плюс.
Частые ошибки
- Помнить только про взаимное исключение и забывать про видимость.
- Синхронизироваться на разных объектах и считать код защищённым.
Проверьте себя
Один верный вариант. Подумайте, потом откройте ответ.
Показать варианты и ответ
- ✗Ускорение выполнения блока за счёт приоритета потока
- ✗Гарантию, что блок выполнится без исключений и без переключений контекста
- ✗Выполнение блока в отдельном потоке
- ✓Один поток в блоке за раз и видимость его изменений
Что спросят дальше
- Что произойдёт при вызове одного синхронизированного метода из другого?
- На каких объектах не стоит синхронизироваться?
Разбор темы
- synchronized, мониторы и wait/notify
Взаимное исключение и видимость через монитор, reentrancy, guarded blocks с wait/notify и причины deadlock.
Связанные вопросы
Разбор собеседования с sotto
После собеседования sotto разбирает разговор: оценка, каждый вопрос — хорошо, частично или слабо, чего не хватило в ответе и над чем поработать к следующему разу. Первые 30 минут бесплатно.