Этап 6 из 11 · ≈ 8 ч

Потоки и синхронизация

Основа с Junior

Создание и состояния потоков, synchronized, wait/notify, явные блокировки.

Что важно знать

  • Поток останавливают прерыванием, а не stop.
  • synchronized — монитор объекта, взаимное исключение и видимость.
  • wait/notify — только в цикле с условием.
  • ReentrantLock — tryLock с таймаутом, справедливость, несколько условий.

Критерии освоения

Junior ≈ 8 ч

  • Создаёт потоки и объясняет их состояния и корректную остановку через прерывание
  • Защищает общее состояние synchronized

Практика. Сделать потокобезопасный счётчик и банковский перевод между счетами без гонок.

Middle ≈ 6 ч

  • Использует ReentrantLock, ReadWriteLock и Condition по назначению
  • Находит взаимную блокировку по дампу потоков

Практика. Воспроизвести взаимную блокировку, найти её через jstack и исправить порядком захвата.

Проверка знаний

Войдите, чтобы пройти тест: сданный тест отмечает тему пройденной на карте и в ИПР.

Вопросы с собеседований

Смотреть все
Чем Thread, Runnable и Callable отличаются?Junior

Thread — сам поток выполнения. Runnable — задача без результата (void run()), Callable<V> — задача с результатом V call(), которая может бросить проверяемое исключение.

Полный разбор
Чем volatile отличается от synchronized?Middle

volatile — видимость и порядок для одной переменной без блокировки. synchronized — видимость плюс взаимное исключение: блок целиком выполняется одним потоком, поэтому составные действия становятся атомарными.

Полный разбор
Что даёт оптимистичное чтение в StampedLock и о каком его ограничении важно помнить?Senior

tryOptimisticRead даёт метку, данные читаются без блокировки, затем validate проверяет, не было ли записи; не прошла — повтор или обычная блокировка чтения. Ограничения: данные между меткой и проверкой могут быть несогласованными, и StampedLock не…

Полный разбор
Чем вызов start() у потока отличается от прямого вызова run()?Junior

start() создаёт новый поток, и уже он вызывает run(); прямой run() выполняется в текущем потоке, как обычный метод.

Полный разбор
Что такое deadlock и как его предотвращать?Middle

Deadlock — циклическое ожидание: поток A держит замок 1 и ждёт замок 2, поток B держит 2 и ждёт 1. Предотвращают единым порядком захвата, tryLock с таймаутом и откатом, короткими критическими секциями без вызова чужого кода под замком.

Полный разбор
Что обеспечивает ключевое слово synchronized?Junior

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

Полный разбор
Где должен располагаться вызов unlock() при работе с ReentrantLock?Junior

unlock() — в finally, а lock() — перед try: иначе исключение в критической секции оставит замок захваченным навсегда.

Полный разбор
Что даёт переменная типа ThreadLocal?Junior

ThreadLocal — своя ячейка значения для каждого потока: синхронизация не нужна, потому что значение никто не разделяет.

Полный разбор

Разборы темы

← Вся карта «Java»

Партнёр платформы

Разбор собеседования с sotto

После собеседования sotto разбирает разговор: оценка, каждый вопрос — хорошо, частично или слабо, чего не хватило в ответе и над чем поработать к следующему разу. Первые 30 минут бесплатно.

Разбор собеседования