💻 Карта сайта
-
Почему вообще появился AQS • Главная идея AQS • Как выглядит архитектура AQS • AbstractQueuedSynchronizer vs BlockingQueue • Почему именно очередь • Внутренний Node очереди • End-to-End сценарий lock() • Шаг 1 — попытка CAS • Шаг 2 — поток не смог получить lock • Шаг 3 — парковка потока • Шаг 4 — unlock • Почему используется CAS • Влияние на JVM Memory Model • Влияние на CPU cache • Влияние на OS threads • GC последствия • Production кейс • Trade-offs AQS • Инженерная интуиция
-
Первая наивная идея: просто synchronized • Вторая попытка: lock striping • Проблема №1 — фиксированная параллельность • Проблема №2 — resize • Проблема №3 — memory overhead • Архитектура ConcurrentHashMap (JDK8) • End-to-End операция put • Когда CAS не помогает • Когда bucket превращается в дерево • Resize — самая сложная часть • Java Memory Model • CPU Cache Effects • Влияние на GC • Реальный production кейс • Главные trade-offs • Самая важная инженерная идея • Инженерная интуиция • Главный вывод
-
1️⃣ HashMap / TreeMap / TreeSet (не потокобезопасные) • 2️⃣ SynchronizedMap / SynchronizedSortedMap / SynchronizedSortedSet • 3️⃣ ConcurrentHashMap • 4️⃣ ConcurrentSkipListMap / ConcurrentSkipListSet • 5️⃣ AtomicInteger / AtomicReference / AtomicLong • Таблиц для сравнения: один элемент, два потока • Таблица: один элемент редактируется двумя потоками + новый ключ добавляется • Сравнение потокобезопасных отсортированных коллекций • 🔹 Выводы • 🔹 Практическое правило
-
Признаки легаси-проекта: как распознать старый корабль • 1. Вернуть наблюдаемость: включить свет в машинном отсеке • 2. Стабилизировать очаги хаоса: потушить чёрные дыры • 3. Построить тестовую страховку: закрепить борта • 4. Обновить фундамент: заменить сгнившие доски • 5. Снять связанность: вернуть стройность корпуса • 6. Вернуть знания команде: убрать культ «единственного жреца» • 7. Модернизировать постепенно: без революций • 8. Обновить инфраструктуру: дать кораблю мотор нового поколения • 9. Постоянная выплата долга: маленькие шаги дают долгую жизнь • Итог: старые корабли ходят долго, если о них заботятся • Быстрая диагностика вашего легаси-проекта • Тест — Насколько ваш проект стал легаси
-
Введение • 1. Эволюция архитектур • 2. CQRS и Event Sourcing • 3. DDD — проектирование через смысл • 4. Реактивные архитектуры • 5. Как выбрать подход • Подводные камни • Event Sourcing — взрывает сложность при миграциях • DDD — требует дисциплины в названии сущностей (и не только) • Микросервисы — увеличивают инфраструктурные расходы • Заключение • Тест — уровень архитектурного мышления Java-разработчика
-
1. Goroutine vs Thread • 2. Channels — безопасный обмен данными • 3. Unbuffered vs Buffered Channels • 4. Select — ожидание нескольких каналов • 5. Timeout / Deadline • Сравнение Go и Java по основам параллельности • Контекст для отмены и таймаутов: `context.Context` vs Java • Пример на Go • Как это решается в Java • Советы и нюансы • Сложные кейсы повышенной сложности • 1. Worker Pool (пул воркеров) • 2. Fan-In / Fan-Out • 3. Timeout / Отмена цепочки задач • Итог
-
Схема - Java Memory Model - Heap / Non-Heap / Stack • Java Memory Deep Dive: как объекты, примитивы и методы живут в памяти • Java Memory Example: Пояснение • Java Caching и GC: как SoftReference влияет на жизнь объектов в памяти • Java SoftReference Cache Example: Пояснение • Gример с JVM, JIT и Code Cache
-
Что такое переменная • Синтаксис объявления переменной • Правила именования переменных • Примеры корректных имён • Основные типы данных (кратко) • Код — примеры типов • Объявление vs Инициализация • Динамическая инициализация • Область видимости (scope) и время жизни • Пример: вложенные области • Инициализация внутри блока • Ограничение: нельзя объявлять одинаковые имена во вложенных областях • Константы • Рекомендации • Домашнее задание • Тест — Насколько ты понял урок?
-
2. Virtual Threads — миллионы лёгких потоков • ✅ Плюсы Virtual Threads • ❌ Минусы Virtual Threads • 3. GraalVM — универсальный ускоритель • ✅ Плюсы GraalVM • ❌ Минусы GraalVM • 4. Quarkus — Java для облаков и ИИ • ✅ Плюсы Quarkus • ❌ Минусы Quarkus • 5. Почему это не замена, а зрелость • 6. Общее направление
-
Предисловие • Сравнение подходов к параллелизму в Java • 1️⃣ Fork/Join Framework • Ключевые элементы: • Пример: • 2️⃣ CompletableFuture — асинхронность с функциональным стилем • Основные возможности: • Пример цепочки CompletableFuture: • 3️⃣ Виртуальные потоки (Project Loom) • Преимущества: • Пример виртуальных потоков: • 4️⃣ Как выбрать подходящий инструмент • Переход от потоков к современным инструментам • На основе чего CompletableFuture принимает решения • Виртуальные потоки (Project Loom) — будущее многопоточности в Java • Коротко о сути • Пример: обычные потоки vs виртуальные • Ключевые преимущества • Когда использовать • Ограничения и подводные камни • Практическая миграция • Краткий вывод • Виртуальные потоки Loom как метавселенная • Сравнение подходов к параллелизму в Java и предпосылки для выбора • Итог
-
Object Allocation — Выделение объектов • Stack — Стек вызовов и локальные переменные • Heap — Куча • Allocation Patterns (Шаблоны выделения памяти) • Object Lifetime Optimization (Оптимизация времени жизни объектов) • Cache Locality (Локальность кэша) • CPU Cache Line • False Sharing • Backpressure через Channels • Вывод
-
1) Простой if / else • 2) else if — цепочка проверок • 3) Операторы сравнения и отрицание • 4) Логические операторы: && (И) и || (ИЛИ) • 5) Тернарный оператор — компактно, но осторожно • 6) switch — когда много дискретных вариантов • 7) Небольшая шпаргалка для отладки • Тест — Насколько ты понял урок?
-
atomic.CompareAndSwap • stack vs heap escape • sync.Pool • goroutine stack splitting • memory consistency model • scheduler preemption • unsafe basics • cache locality • allocation cost optimization • runtime.Gosched • runtime.LockOSThread • runtime.GC • High-Concurrency Patterns • GMP Scheduler Model • Вывод / Итог
-
Build Tags • Dead Code Elimination (Удаление неиспользуемого кода) • Package Init Order (Порядок инициализации пакетов) • Linker Behavior • Go Vet • Go Test -bench • Go Tool PProf • Go Tool Trace • Escape Analysis Flags • Общая логика сравнения: как думать про Go ↔ Java • Общая таблица сравнения терминов • Общие схемы и ментальные модели • Практический итог
-
Runtime Scheduler (Планировщик выполнения) • Memory Barriers (Барьеры памяти) • Memory Alignment (Выравнивание памяти) • Stack Growth / Shrinkage (Рост и уменьшение стека) • Memory Fragmentation (Фрагментация памяти) • Allocation Hotspot (Горячие точки аллокации) • mcache / mcentral / mheap (Архитектура аллокатора Go) • Stack Overflow Handling (Обработка переполнения стека) • Span (mspan в Go allocator) • Page (Страница памяти) • Итог
-
unsafe.Pointer • Struct field alignment (выравнивание полей) • Pointer arithmetic (арифметика указателей) • Zero-copy techniques • iota • Interface internals (itab, dynamic dispatch) • runtime.SetFinalizer • runtime.KeepAlive • Обзор тем • Ключевые различия философии Go ↔ Java • Сравнительная таблица всех терминов • Как выбирать подход (Go vs Java) • Итог
-
1. Базовая правда: Stream vs For — это не равная битва • 2. Почему for быстрее • 3. Почему Stream медленнее • 4. Boxing — главный убийца производительности • 5. Когда Stream НЕ хуже • 6. Когда Stream сильно проигрывает • 7. JIT и почему результаты “плавают” • 8. CPU cache и порядок вызовов • 9. Практическое правило выбора • Используй for если: • Используй Stream если: • 10. Финальный вывод • ⚔️ Stream vs For в Java — максимально подробная сравнительная таблица • ⚡ Stream vs Loop - Пример кода с комментариями
-
⚡ 1. Простое объяснение • 🔥 2. Пример: аллокации • 3. Где появляются скрытые аллокации • 1. Collections • 2. Streams • 3. String operations • 4. Exceptions • ⚙️ 4. Где Zero Allocation реально важен • 🚀 5. Как достигается Zero Allocation • 🧠 6. Важный момент про JVM • 💣 7. Где Zero Allocation ломается • 📊 8. Сравнение подходов • 🏁 Итог
Полезные статьи:
Переменные в Java — понятие, типы, область видимости и константы Всем привет! С вами Виталий Лесных. В этом уроке разберём, что такое переменные в Java, зачем они нужны, какие бывают типы, как объявля...
Модель памяти — это слой между программой и процессором. Современные CPU агрессивно оптимизируют выполнение: инструкции могут переставляться, данные могут храниться в кешах ядер, а операции могут выпо...
Atomic operations Atomic операции обеспечивают корректное выполнение операций с переменными без гонок, гарантируя happens-before между чтением и записью. Go пример: import "sync/atomic" var counter in...
Новые статьи:
Конкурентность — это не про «запустить много потоков». Это про договорённости между ними. Представь кухню ресторана: — повара (потоки / горутины) — заказы (задачи) — и главный вопрос: как они коорди...
История начинается не с академической теории, а с типичной production-проблемы. Представьте сервис: 48 CPU 300+ потоков нагрузка 200k операций в секунду много shared state Команда использует обы...
Представьте обычный продакшн-сервис. 32 CPU сотни потоков кэш конфигурации / сессий / rate limits десятки тысяч операций в секунду И где-то внутри — обычный Map. Сначала всё выглядит безобидно. Map&...