Программа и содержание

Разберись в потоках от фундамента до production-кода.

Будешь спокойно писать многопоточные приложения, проходить собесы на middle+ без страха и сможешь претендовать на вакансии с зарплатой в 2 раза выше.

Для кого этот курс:

Новичок, знающий только базу по Java и Spring

Сейчас самое время освоить многопоточность. Гораздо проще разобраться с ней на старте карьеры, чем потом догонять под давлением боевых задач.

Junior/Middle Java-разработчик

Умеешь писать REST API, работаешь с базами данных, но многопоточность остаётся белым пятном и это мешает браться за самые интересные проекты

Хочешь качать харды

Тебе важно становиться сильнее как кодер и расти по ЗП с помощью хардов, а не самопрезентаций и легенд

Программа:

Модуль 1. Открываем капот: потоки, процессы, Threads API, JVM, Daemon, Synchronized, Volatile

Зачем нужна многопоточность: где однопоточность «держит» систему; эффект очередей и блокирующих операций

Поток как единица исполнения в общей памяти процесса: общий heap, stack у каждого потока

Program → Process → Thread: от запуска программы до выполнения кода в потоке

Планировщик ОС: очереди Ready/Waiting/Blocked; RUNNABLE ≠ RUNNING; стоимость переключений контекста; недетерминизм порядка

Базовый Thread API: Thread/Runnable; start vs run; join; sleep (TIMED_WAITING); interrupt и восстановление флага; наблюдение состояний (getState)

Daemon vs User: определение, назначение, условия завершения JVM, риски использования демонов для бизнес‑логики

Введение в синхронизацию: race condition; mutex/критическая секция; synchronized; volatile;

Результат:

Поймёшь, как устроены процессы и потоки в JVM и ОС, где у них общая и изолированная память

Сможешь уверенно создавать и управлять потоками: запуск, ожидание, усыпление, корректная остановка.

Научишься объяснять работу планировщика, очереди Ready/Waiting/Blocked и почему порядок выполнения непредсказуем

Будешь различать user‑ и daemon‑потоки и поймёшь, когда и почему JVM завершает работу.

Освоишь базу синхронизации: зачем нужен mutex, когда использовать synchronized, а когда volatile (видимость)

Модуль 2. Укрощаем хаос: JMM, Reordering, ReentrantLock, Semaphore, Deadlock, Livelock

Java Memory Model (JMM): program order, happens‑before, основные HB‑рёбра (unlock→lock, volatile write→read, start/join).

Reordering: где возможен (компилятор/JIT/CPU) и почему без HB порядок не гарантирован; volatile — видимость/порядок, но не атомарность

Межпоточная сигнализация: монитор, очереди EntryList/WaitList, wait/notify/notifyAll, spurious wakeups и правило while; тайм‑ауты ожидания.

ReentrantLock и Condition: re‑entry, lockInterruptibly (), tryLock (timeout), await/signal, несколько условий ожидания.

Semaphore: permits, ограничение параллелизма, fair/non‑fair режимы.

ReadWriteLock: совместимость читателей, эксклюзивный писатель, отсутствие безопасного апгрейда read→write, starvation и fair‑режим.

CountDownLatch: одноразовый барьер N→0, await (timeout), сценарии start‑gate/completion‑gate.

Атомики и CAS: Atomic*, CAS‑цикл, конфликты и спины, ABA и AtomicStampedReference.

Deadlock: как обнаружить, условия Коффмана, «обедающие философы», порядок локов, tryLock (timeout) + откат.

Livelock: «уступчивые» симметричные протоколы, разрыв симметрии (backoff/приоритет).

ThreadLocal: внутренняя модель (ThreadLocalMap), кейсы применения, утечки в пулах и best‑practices

Практика: собственная ArrayBlockingQueue на synchronized + wait/notify, продюсеры/консюмеры, проверка корректности.

Результат:

Узнаешь, как Java гарантирует видимость и порядок между потоками (Java Memory Model, happens‑before, reordering).

Получишь набор практических приёмов межпоточной сигнализации (wait/notify/notifyAll) и научится избегать типовых багов (потерянные сигналы, ложные пробуждения).

Сможешь осознанно выбирать примитив синхронизации (ReentrantLock/Condition, Semaphore, ReadWriteLock, CountDownLatch) под задачу и использовать тайм‑ауты/прерывание для выхода из вечного ожидания.

Научишься применять атомики и CAS, объяснять ABA‑проблему и её фиксы.

Сможешь воспроизводить и устранять deadlock и livelock (включая «уступчивый» сценарий), работать с ThreadLocal без утечек и реализовать безопасную блокирующую очередь

Модуль 3. Продвинутые средства: ExecutorService, CompletableFuture, Concurrent Collections, Virtual Threads

I/O-bound vs CPU-bound: задачи, ограниченные скоростью операций ввода-вывода, и задачи, ограниченные вычислительными ресурсами; определения, метрики и стратегия выбора пула потоков.

ExecutorService и разновидности ThreadPoolExecutor: FixedThreadPool, CachedThreadPool, ScheduledThreadPool и SingleThreadExecutor; работа очереди задач, рабочих потоков и механизмы завершения пула.

ForkJoinPool: модель work-stealing (распределения задач с кражей работы), использование классов RecursiveTask и RecursiveAction; общий ForkJoinPool для параллельных потоков (parallel streams) и пул по умолчанию для CompletableFuture.

Parallel Streams: когда применение оправдано, влияние числа доступных процессорных ядер (Runtime.getRuntime ().availableProcessors ()), и почему такие потоки не подходят для сценариев с интенсивным вводом-выводом.

Асинхронная модель: интерфейсы Runnable, Callable и Future; жизненный цикл Future; использование CompletableFuture, основные операторы, обработка ошибок и таймауты.

Потокобезопасные коллекции: ConcurrentHashMap, CopyOnWriteArrayList, ArrayBlockingQueue и LinkedBlockingQueue (массив против связного ccc, примеры проблем при использовании обычных HashMap и ArrayList в многопоточности.

Virtual Threads: создание через Thread.ofVirtual ().start () и Executors.newVirtualThreadPerTaskExecutor (); как JVM сопоставляет виртуальных и системных потоков (N к M), механизмы монтирования и размонтирования, сравнение с потоками операционной системы и ограничения в java-21

Результат:

Поймёшь разницу между IO‑bound и CPU‑bound задачами и научишься выбирать модель выполнения под профиль нагрузки (ThreadPoolExecutor vs ForkJoinPool vs Virtual Threads)

Сможешь безопасно работать с пулами потоков: конфигурация, отправка задач, корректное завершение (shutdown/awaitTermination), анти‑паттерны ожидания на get/join без нужды

Освоит Runnable/Callable/Future и построение неблокирующих цепочек на CompletableFuture (thenApply/thenCompose/thenCombine/allOf/anyOf, обработка ошибок exceptionally/handle)

Разберёшь устройство и гарантии популярных конкурентных коллекций (ConcurrentHashMap, CopyOnWriteArrayList, ArrayBlockingQueue, LinkedBlockingQueue) и применишь их вместо небезопасных аналогов под кон