Java Memory Model (JMM) описывает, как
Без JMM
#concurrency
Please open Telegram to view this post
VIEW IN TELEGRAM
👍6❤3🔥1
«Diamond problem» возникает при
В Java классы
#tests
Please open Telegram to view this post
VIEW IN TELEGRAM
👍13❤3🔥1
👀 Задача с собеса: «Single-flight» объединение запросов к внешнему API (middle+)
Компания ловит шторма трафика: десятки потоков одновременно дергают один и тот же медленный эндпоинт (например, профили клиентов). Хотят убрать дубликаты запросов и снизить нагрузку на апстрим. Задача:
▪️ Условия
— API: CompletableFuture<V> getOrLoad(K key, Supplier<V> loader) (или Supplier<CompletableFuture<V>>, если загрузка уже async).
— Если в кэше есть не сгоревший ключ, вернуть немедленно. Если нет — запустить единственную загрузку на ключ и раздать один и тот же Future всем конкурентным вызовам.
— По завершении загрузки положить результат в кэш с expireAt.
— Удаление сгоревших записей ленивое (на чтении/записи), без фоновых сканеров.
— Критические секции минимальные; без глобальных блокировок.
💡 Ключевые моменты
— Объединение запросов: ConcurrentHashMap<K, CompletableFuture<V>> inFlight + computeIfAbsent исключит дубликаты.
— Кэш: ConcurrentHashMap<K, Entry<V>> cache, где Entry хранит value и expireAt.
— TTL: проверка сроков строго точечная; протухшее удаляем перед использованием.
— Ошибки: один промах/ошибка должны одинаково прилететь всем конкурентным ожидающим.
— Производительность: никакой синхронизации на весь объект; один ключ — одна «тонкая» операция.
💬 Возможная реализация в комментариях. Пишите также ваши реализация и способы оптимизации.
🐸 Библиотека собеса по Java
#practice
Компания ловит шторма трафика: десятки потоков одновременно дергают один и тот же медленный эндпоинт (например, профили клиентов). Хотят убрать дубликаты запросов и снизить нагрузку на апстрим. Задача:
Реализуйте in-memory «single-flight» слой, который:
— Для одного и того же ключа выполняет ровно ОДНУ загрузку, остальные ожидают тот же результат.
— Имеет короткоживущий кэш (TTL) для защиты от штамповки (cache stampede).
— Потокобезопасен и работает за O(1) на обращение (без полных проходов).
— Прозрачно пробрасывает исключение всем конкурентным ожидателям, если загрузчик упал.
▪️ Условия
— API: CompletableFuture<V> getOrLoad(K key, Supplier<V> loader) (или Supplier<CompletableFuture<V>>, если загрузка уже async).
— Если в кэше есть не сгоревший ключ, вернуть немедленно. Если нет — запустить единственную загрузку на ключ и раздать один и тот же Future всем конкурентным вызовам.
— По завершении загрузки положить результат в кэш с expireAt.
— Удаление сгоревших записей ленивое (на чтении/записи), без фоновых сканеров.
— Критические секции минимальные; без глобальных блокировок.
— Объединение запросов: ConcurrentHashMap<K, CompletableFuture<V>> inFlight + computeIfAbsent исключит дубликаты.
— Кэш: ConcurrentHashMap<K, Entry<V>> cache, где Entry хранит value и expireAt.
— TTL: проверка сроков строго точечная; протухшее удаляем перед использованием.
— Ошибки: один промах/ошибка должны одинаково прилететь всем конкурентным ожидающим.
— Производительность: никакой синхронизации на весь объект; один ключ — одна «тонкая» операция.
#practice
Please open Telegram to view this post
VIEW IN TELEGRAM
👍8❤2🔥2
Как вы и просили: добавили тестово теги по темам. Что скажете?
🔥 — Супер, удобно
😁 — Неудобно, верните как было
Если есть какие-то комментарии/мысли на этот счёт → велком в комменты.
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥16😁5❤2🤔1
Lazy loading — данные загружаются
Eager loading — связанные данные загружаются
Выбор стратегии зависит от сценария и баланса между производительностью и простотой.
#spring
Please open Telegram to view this post
VIEW IN TELEGRAM
👍7🔥1👏1
Effective final — это
Компилятор Java рассматривает такие переменные как final и
#core
Please open Telegram to view this post
VIEW IN TELEGRAM
👍10🔥2👏1🤔1
ThreadLocal — это механизм, который
Применения:
—
—
—
#concurrency
Please open Telegram to view this post
VIEW IN TELEGRAM
👍5❤2🔥2
Микросервисы — это
Они взаимодействуют между собой через
Главные плюсы —
Такой подход противопоставляется
#patterns
Please open Telegram to view this post
VIEW IN TELEGRAM
👍8❤1🔥1👏1
this — это
—
—
—
—
#core
Please open Telegram to view this post
VIEW IN TELEGRAM
👍8❤3🔥1
ConcurrentHashMap использует
В отличие от Collections.synchronizedMap(...), который
#concurrency
Please open Telegram to view this post
VIEW IN TELEGRAM
👍9🔥2👏1
Попробуем новый формат, сами задачки будут разные. Представим задачу 👇
Есть список строк:
List<String> names = List.of("Alice", "Bob", "Anna", "Brian", "Alex");
📋 Задание:
Сгруппируйте имена по первой букве и выведите результат в формате:
A -> [Alice, Anna, Alex]
B -> [Bob, Brian]
Ставьте →🔥, если зашёл формат. Если нет, то → 🤔
#practise
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥23👍2🤔2
Escape analysis — это
—
—
—
Таким образом
#jvm
Please open Telegram to view this post
VIEW IN TELEGRAM
👍7🔥2👏1