Многопоточность
Раздел про многопоточность в Java простыми словами: потоки и модель памяти (JMM, happens-before, volatile), гонки, synchronized и блокировки, atomics и CAS, потокобезопасные коллекции, пулы потоков, CompletableFuture, виртуальные потоки Java 21 и типичные баги.
Раздел с нуля про многопоточность и конкурентность в Java: как устроены потоки и модель памяти, почему возникают гонки и как от них защищаться, какие есть инструменты — от synchronized до виртуальных потоков Java 21 — и какие баги подстерегают. Читать лучше по порядку.
- Потоки и процессы в Java — Что такое поток и процесс, зачем нужна многопоточность, как запустить поток в Java и чем поток отличается от задачи — разбор с нуля.
- Модель памяти Java (JMM): видимость и happens-before — Почему два потока видят разные значения одной переменной и как Java Memory Model гарантирует видимость: happens-before, volatile, final-поля простыми словами.
- Гонки в многопоточных программах: race condition и data race — Разбираем два вида гонок — состояние гонки и гонку данных — на примере счётчика, выясняем почему ++ не атомарен и какие три свойства нужно контролировать.
- synchronized и мониторы: взаимное исключение в Java — Простыми словами: что такое критическая секция и монитор, как synchronized защищает разделяемые данные, на каком объекте синхронизироваться и как работает happens-before.
- Явные блокировки: Lock и ReentrantLock — Когда synchronized не хватает: Lock, ReentrantLock, tryLock, fairness, ReadWriteLock — как устроены явные блокировки в Java и когда их применять.
- Атомарные переменные и CAS в Java — Как AtomicInteger, AtomicReference и CAS позволяют менять данные без блокировок, и когда LongAdder справляется лучше, чем AtomicLong.
- Потокобезопасные коллекции в Java — Почему HashMap и ArrayList ломаются в многопоточном коде и как ConcurrentHashMap, CopyOnWriteArrayList и BlockingQueue решают эту проблему.
- Пулы потоков: ExecutorService — Зачем нужен пул потоков, как устроен ExecutorService, ThreadPoolExecutor и как правильно завершать работу пула — разбор с примерами на Java 21.
- CompletableFuture: асинхронные задачи в Java — Разбираем CompletableFuture: как запускать задачи асинхронно, выстраивать цепочки, комбинировать результаты и грамотно обрабатывать ошибки.
- Виртуальные потоки в Java 21 — Что такое виртуальные потоки, чем они отличаются от платформенных и как модель «поток на задачу» снова становится дешёвой в Java 21.
- Deadlock, livelock и starvation: когда потоки мешают друг другу — Разбираем три классических сбоя многопоточного кода: дедлок, лайвлок и голодание — что это, почему происходит и как от них защититься.