Многопоточность — вторая по частоте тема Java-собеседований и главный источник трудных багов в продакшене. Для middle ждут уверенного владения пулами, CompletableFuture, конкурентными коллекциями и понимания, почему нужен volatile. Для senior — Java Memory Model, диагностику взаимных блокировок и виртуальные потоки.
Многопоточность
Потоки и синхронизация, Java Memory Model, пулы, CompletableFuture, конкурентные коллекции и виртуальные потоки.
Темы этапа
- Потоки и синхронизация Основа
Создание и состояния потоков, synchronized, wait/notify, явные блокировки.
- Java Memory Model и атомарность Основа
happens-before, volatile, атомарные классы и CAS.
- Пулы потоков и CompletableFuture Основа
ExecutorService, размеры пулов, Future и CompletableFuture, ThreadLocal и Fork/Join.
- Конкурентные коллекции и координация Основа
ConcurrentHashMap, CopyOnWrite, BlockingQueue, семафоры, защёлки и барьеры.
- Виртуальные потоки Основа
Project Loom — миллионы лёгких потоков для блокирующего кода.
Вопросы с собеседований
Смотреть всеЧем Thread, Runnable и Callable отличаются?Junior
Thread — сам поток выполнения. Runnable — задача без результата (void run()), Callable<V> — задача с результатом V call(), которая может бросить проверяемое исключение.
Полный разборЧто гарантирует ключевое слово volatile для переменной?Middle
volatile даёт видимость (запись сразу видна другим потокам) и запрет переупорядочивания вокруг обращения, но не атомарность: count++ на volatile-поле всё равно теряет обновления.
Полный разборЧто такое Fork/Join framework и work stealing?Senior
Fork/Join — рекурсивное деление задачи на подзадачи (fork) с последующим объединением результатов (join). Work stealing: у каждого рабочего потока своя двусторонняя очередь, а освободившийся поток крадёт задачи с хвоста чужой очереди — нагрузка балансируется…
Полный разборЧем вызов start() у потока отличается от прямого вызова run()?Junior
start() создаёт новый поток, и уже он вызывает run(); прямой run() выполняется в текущем потоке, как обычный метод.
Полный разборЧем volatile отличается от synchronized?Middle
volatile — видимость и порядок для одной переменной без блокировки. synchronized — видимость плюс взаимное исключение: блок целиком выполняется одним потоком, поэтому составные действия становятся атомарными.
Полный разборПочему опасно выполнять блокирующие операции в стадиях CompletableFuture без явного Executor?Senior
Async-стадии без Executor выполняются в ForkJoinPool.commonPool — он общий на всю JVM и размером примерно число ядер − 1. Блокирующие вызовы (HTTP, БД, get чужого future) занимают его потоки, и встаёт всё, что им пользуется: другие цепочки, parallel stream…
Полный разборРазборы темы
- volatile, атомарность и CAS
Разница видимости и атомарности, atomic-классы, compare-and-swap и ABA, контеншн и LongAdder.
- Future и CompletableFuture
Ограничения Future, асинхронная композиция CompletableFuture, async-варианты с пулами и обработка ошибок.
- Координация: семафоры, защёлки и барьеры
Semaphore, CountDownLatch, CyclicBarrier, Phaser и Exchanger — что каждый делает и когда выбирать.
- Пулы потоков и ExecutorService
Зачем пул, параметры ThreadPoolExecutor, ловушки фабрик Executors, выбор размера и корректное завершение.
- Явные блокировки: ReentrantLock, RW и Condition
Когда synchronized мало, ReentrantLock с tryLock/fairness, ReadWriteLock и StampedLock, Condition вместо wait/notify.
- synchronized, мониторы и wait/notify
Взаимное исключение и видимость через монитор, reentrancy, guarded blocks с wait/notify и причины deadlock.
- ThreadLocal и Fork/Join
Состояние на поток и утечки в пулах, InheritableThreadLocal, work-stealing в ForkJoinPool и общий пул parallel streams.
- Потоки: создание, состояния и отмена
Thread и Runnable, стоимость платформенных потоков, состояния жизненного цикла, кооперативное прерывание и daemon-потоки.
- Виртуальные потоки (Project Loom)
Лёгкие потоки JVM, монтирование на carrier, когда их применять, почему не пулят и проблема pinning.
Разбор собеседования с sotto
После собеседования sotto разбирает разговор: оценка, каждый вопрос — хорошо, частично или слабо, чего не хватило в ответе и над чем поработать к следующему разу. Первые 30 минут бесплатно.