Проверяет знание моделей параллелизма JVM, управления потоками и проблем синхронизации.
В Java каждый Thread — отдельный поток ОС, выполняющий байткод JVM. Потоки видят общий кучу памяти, но имеют собственный стек и набор регистров. Для координации доступа к общим ресурсам применяют synchronized, Lock, volatile и высокоуровневые конструкции (ExecutorService, Semaphore).
Запуск и жизненный цикл:
new Thread(runnable).start() создаёт и запускает ОС-поток.
Состояния: New → Runnable → Running → Blocked/Waiting → Terminated.
Общая память и видимость:
Heap разделяется между всеми потоками; стек и регистры локальны.
volatile гарантирует видимость изменений переменной между потоками.
Синхронизация:
synchronized блок или метод: мониторы объектов; вход в блок требует захвата монитора, выход — освобождения.
Lock (ReentrantLock): более гибкие возможности (tryLock, fair).
Проблемы:
Гонки: одновременное изменение разделяемых данных без синхронизации.
Deadlock: взаимная блокировка потоков на нескольких мониторах.
Live lock и starvation.
Высокоуровневый API:
ExecutorService: пул потоков, планирование задач.
ForkJoinPool: для рекурсивных задач через ForkJoinTask.
CompletableFuture: асинхронные конвейеры обработки.