💻 Карта сайта - Java
-
Почему вообще появился 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 • Таблиц для сравнения: один элемент, два потока • Таблица: один элемент редактируется двумя потоками + новый ключ добавляется • Сравнение потокобезопасных отсортированных коллекций • 🔹 Выводы • 🔹 Практическое правило
-
Схема - 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 и предпосылки для выбора • Итог
-
1) Простой if / else • 2) else if — цепочка проверок • 3) Операторы сравнения и отрицание • 4) Логические операторы: && (И) и || (ИЛИ) • 5) Тернарный оператор — компактно, но осторожно • 6) switch — когда много дискретных вариантов • 7) Небольшая шпаргалка для отладки • Тест — Насколько ты понял урок?
-
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. Сравнение подходов • 🏁 Итог
Полезные статьи:
Продолжаем серию статей для разработчиков, которые хотят изучить Go на основе знаний Java, и наоборот. В этой статье мы обсудим три ключевые темы: Resource Cleanup (освобождение ресурсов), Rate-Limiti...
Серия: Go для Java-разработчиков — разбираем struct, interface, receiver types и type embedding В этой статье мы разберем, как в Go строится архитектура типов. Для Java-разработчика это особенно важн...
Конкурентность — это не про «запустить много потоков». Это про договорённости между ними. Представь кухню ресторана: — повара (потоки / горутины) — заказы (задачи) — и главный вопрос: как они коорди...
Новые статьи:
Конкурентность — это не про «запустить много потоков». Это про договорённости между ними. Представь кухню ресторана: — повара (потоки / горутины) — заказы (задачи) — и главный вопрос: как они коорди...
История начинается не с академической теории, а с типичной production-проблемы. Представьте сервис: 48 CPU 300+ потоков нагрузка 200k операций в секунду много shared state Команда использует обы...
Представьте обычный продакшн-сервис. 32 CPU сотни потоков кэш конфигурации / сессий / rate limits десятки тысяч операций в секунду И где-то внутри — обычный Map. Сначала всё выглядит безобидно. Map&...