Как работает ConcurrentSkipListMap под капотом?
ConcurrentSkipListMap — это потокобезопасная и отсортированная реализация интерфейса NavigableMap, которая работает на основе skip list (списка с пропусками). Skip list — это многослойная структура данных, состоящая из нескольких уровней связных списков: нижний уровень содержит все элементы в порядке сортировки, а верхние уровни — лишь часть элементов для ускорения поиска. При добавлении элемента случайно выбирается его "высота" (количество уровней, на которых он присутствует), что позволяет "перепрыгивать" через блоки данных на верхних уровнях и выполнять операции со сложностью O(log n).
Пример структуры:
💡 Основные механизмы:
🟡 Skip List: Многослойный список с пропусками, где верхние уровни помогают быстро достигать нужного диапазона элементов, снижая количество переходов по связям.
🟡 Потокобезопасность обеспечивается за счёт использования CAS (Compare-And-Swap) операций и минимального блокирования. Модификации происходят безопасно без полной блокировки структуры.
🟡 Элементы всегда хранятся в отсортированном порядке по их ключам, что позволяет выполнять операции вроде поиска диапазонов или итераций по упорядоченным ключам очень эффективно.
🟡 Высокая доступность: чтение не блокируется, даже если выполняются параллельные операции вставки или удаления.
⚠️ Особенности:
🔘 Операции чтения (например, get или containsKey) выполняются быстро и без блокировок благодаря структуре skip list.
🔘 Операции записи (например, put и remove) синхронизированы, но производительность сохраняется за счёт оптимизации с использованием CAS.
🔘 Поддерживает натуральный порядок ключей или порядок, определённый переданным компаратором.
🔘 Эффективен для сценариев, где важны отсортированные данные и параллельный доступ, но количество обновлений не слишком велико.
🚀 Когда использовать ConcurrentSkipListMap?
- Если нужен параллельный доступ к отсортированной мапе.
- Для обработки диапазонов данных или частых операций чтения в упорядоченном виде.
🔗 Документация
Подписывайся на наш канал в Max🟪
ConcurrentSkipListMap — это потокобезопасная и отсортированная реализация интерфейса NavigableMap, которая работает на основе skip list (списка с пропусками). Skip list — это многослойная структура данных, состоящая из нескольких уровней связных списков: нижний уровень содержит все элементы в порядке сортировки, а верхние уровни — лишь часть элементов для ускорения поиска. При добавлении элемента случайно выбирается его "высота" (количество уровней, на которых он присутствует), что позволяет "перепрыгивать" через блоки данных на верхних уровнях и выполнять операции со сложностью O(log n).
Пример структуры:
lvl 3: 1 ------ 8
lvl 2: 1 --- 7 -- 8
lvl 1: 1 - 3 - 7 - 8 - 10
🚀 Когда использовать ConcurrentSkipListMap?
- Если нужен параллельный доступ к отсортированной мапе.
- Для обработки диапазонов данных или частых операций чтения в упорядоченном виде.
Подписывайся на наш канал в Max
Please open Telegram to view this post
VIEW IN TELEGRAM
👍12❤🔥6🔥5❤3
🔥 Финал набора в группу курса «Архитектура и шаблоны проектирования» от OTUS — успейте пройти тест! 🚀
До закрытия регистрации остаются считаные дни.
Чтобы попасть в поток и зафиксировать спеццену, пройдите вступительное тестирование, которое подтвердит ваш уровень.
Что прокачаете на курсе:
- Паттерны в реальной разработке: Proxy, Factory, Adapter, Observer, Singleton, DDD, CQRS
- Проектирование устойчивых, масштабируемых систем и модульных компонентов
- Осознанный выбор архитектурных решений вместо «заплаток»
- Практику на кейсах с разбором ошибок и сильных решений
⏳ Мест немного, старт на подходе.
Пройдите тест — подтвердите готовность и получите спецусловия на обучение. Подробности уточняйте у менеджера
👉 Перейти к вступительному тестированию: https://vk.cc/cSqaZ7
Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576
До закрытия регистрации остаются считаные дни.
Чтобы попасть в поток и зафиксировать спеццену, пройдите вступительное тестирование, которое подтвердит ваш уровень.
Что прокачаете на курсе:
- Паттерны в реальной разработке: Proxy, Factory, Adapter, Observer, Singleton, DDD, CQRS
- Проектирование устойчивых, масштабируемых систем и модульных компонентов
- Осознанный выбор архитектурных решений вместо «заплаток»
- Практику на кейсах с разбором ошибок и сильных решений
⏳ Мест немного, старт на подходе.
Пройдите тест — подтвердите готовность и получите спецусловия на обучение. Подробности уточняйте у менеджера
👉 Перейти к вступительному тестированию: https://vk.cc/cSqaZ7
Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576
❤2👍2🔥2
Это удобный способ создавать "самоочищающийся" кеш: как только ключ становится недостижимым, GC выбрасывает его, и запись исчезает из карты.
Подписывайся на наш канал в Max
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥8❤4👍3❤🔥1
17 декабря(уже завтра!) в 19:00 по мск приходи онлайн на открытое собеседование, чтобы посмотреть на настоящее интервью на Middle Java-разработчика.
Как это будет:
Это бесплатно. Эфир проходит в рамках менторской программы от ШОРТКАТ для Java-разработчиков, которые хотят повысить свой грейд, ЗП и прокачать скиллы.
Переходи в нашего бота, чтобы получить ссылку на эфир → @shortcut_sh_bot
Реклама.
О рекламодателе.
Please open Telegram to view this post
VIEW IN TELEGRAM
❤2👍2🔥2
В Java 21 появились Virtual Threads — легковесные потоки, которые позволяют писать синхронный код с производительностью асинхронного.
По сути, это JVM-управляемые потоки (а не OS-потоки), которых можно создавать миллионы без значительных затрат памяти. Они решают главную проблему масштабирования традиционных потоков.
Классические Platform Threads имеют проблемы:
— дорогие в создании (~1MB стека на поток);
— ограничены числом (~тысячи потоков максимум);
— при блокировке (IO, sleep) поток простаивает, занимая ресурсы.
Virtual Threads весят ~1KB, создаются мгновенно, и при блокировке платформенного потока освобождается для других задач. Это позволяет обрабатывать миллионы конкурентных запросов.
Когда виртуальный поток блокируется (например, на IO), он "отцепляется" от платформенного потока. Освободившийся платформенный поток берёт другой готовый виртуальный поток. Когда операция завершается, виртуальный поток "подцепляется" обратно к доступному платформенному потоку.
— Pinning (закрепление)
Virtual thread может "застрять" на платформенном потоке при:
• Synchronized блоках
• Нативных методах (JNI)
В таких случаях carrier thread блокируется вместе с virtual thread. Решение: использовать ReentrantLock вместо synchronized.
— ThreadLocal может быть опасен
Миллионы virtual threads с ThreadLocal приведут к огромному потреблению памяти. Используйте ScopedValue (preview feature в Java 21+).
— Не подходит для CPU-bound задач
Virtual threads оптимизированы для IO-bound операций. Для вычислений лучше параллельные стримы или ForkJoinPool.
— Мониторинг
Стандартные инструменты мониторинга потоков могут показывать некорректные данные — они заточены под platform threads.
— Высоконагруженные web-серверы с множеством конкурентных запросов.
— Микросервисы с большим количеством внешних вызовов (HTTP, БД).
— Когда нужна простота синхронного кода без сложности реактивного.
— Замена больших thread pools для IO-операций.
— CPU-intensive вычисления (сортировки, криптография).
— Код с большим количеством synchronized блоков (pinning).
— Легаси-код с активным использованием ThreadLocal.
Подписывайся на наш канал в Max
Please open Telegram to view this post
VIEW IN TELEGRAM
👍18🔥5❤4
Это простой способ остановить обработку списка в нужный момент, не перебирая весь поток.
Подписывайся на наш канал в Max
Please open Telegram to view this post
VIEW IN TELEGRAM
👍13🔥8❤4
Forwarded from Криптонит. Разработка, наука, шифрование
This media is not supported in your browser
VIEW IN TELEGRAM
Мы подарим два эксклюзивных новогодних набора нашим подписчикам — распаковку подарков оставили в видео
Что для этого нужно сделать?
Что в новогоднем подарке?
Результаты подведём 22 декабря в 15:00. Бот выберет победителей случайным образом.
Полные правила конкурса можно почитать тут.
#конкурс #мерч
Please open Telegram to view this post
VIEW IN TELEGRAM
❤3👍3🔥2
Когда рефакторите legacy-код или чистите архитектуру — приходится делать десятки преобразований. А вы знали, что в IDEA есть универсальное меню для всех рефакторингов?
— Открывает контекстное меню со всеми доступными рефакторингами для текущего элемента
— Автоматически фильтрует опции в зависимости от контекста (переменная, метод, класс)
— Позволяет выбрать нужную операцию по цифре или первой букве
— Не нужно помнить десятки отдельных хоткеев — один хоткей открывает все варианты
— Молниеносный доступ к редким, но мощным рефакторингам (Extract Parameter Object, Introduce Parameter, Pull Members Up)
— Безопасно переименовывает, перемещает и трансформирует код с учётом всех зависимостей
— Особенно полезно для сложных преобразований, которые вручную делать долго и опасно
— Поставьте курсор на переменную, метод, класс или любой элемент кода
— Нажмите
Ctrl+Alt+Shift+T (Windows/Linux) или ⌃+T (macOS)— Выберите нужный рефакторинг из списка: Extract Method, Rename, Change Signature, Inline и другие
— Настройте параметры → Enter → готово. IDEA сама обновит все использования
Подписывайся на наш канал в Max
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥6❤3👍3
🧠 Polyglot Persistence: как современные системы живут с десятками баз данных
🔥 23 декабря в 20:00 мск — открытый вебинар в OTUS.
Одна база данных больше не справляется с требованиями современного мира. Сегодня компании вроде Avito, Yandex, Ozon и Spotify объединяют PostgreSQL, ClickHouse, Redis, Kafka, Elasticsearch и десятки других инструментов в единую экосистему, где каждая БД отвечает за свой кусочек производительности.
📌 На вебинаре разберём:
— Принципы Polyglot Persistence и как распределять роли между СУБД
— Как связать PostgreSQL, ClickHouse, Redis и Kafka без потери согласованности
— Как работают event-driven архитектуры, CDC и outbox-паттерн в боевых системах
— Как проектировать отказоустойчивые data-платформы
👉 Регистрация: https://vk.cc/cSxfET
Бесплатное занятие приурочено к старту курса Highload Architect, где вы научитесь проектировать системы, выдерживающие миллионы запросов.
Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576
🔥 23 декабря в 20:00 мск — открытый вебинар в OTUS.
Одна база данных больше не справляется с требованиями современного мира. Сегодня компании вроде Avito, Yandex, Ozon и Spotify объединяют PostgreSQL, ClickHouse, Redis, Kafka, Elasticsearch и десятки других инструментов в единую экосистему, где каждая БД отвечает за свой кусочек производительности.
📌 На вебинаре разберём:
— Принципы Polyglot Persistence и как распределять роли между СУБД
— Как связать PostgreSQL, ClickHouse, Redis и Kafka без потери согласованности
— Как работают event-driven архитектуры, CDC и outbox-паттерн в боевых системах
— Как проектировать отказоустойчивые data-платформы
👉 Регистрация: https://vk.cc/cSxfET
Бесплатное занятие приурочено к старту курса Highload Architect, где вы научитесь проектировать системы, выдерживающие миллионы запросов.
Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576
🔥3❤2👍2
logback-spring.xml).Что это даёт:
✅ Логи отправляются в очередь и обрабатываются отдельным фоновым потоком
✅ Основной поток не блокируется на I/O
✅ Производительность приложения выше под нагрузкой
Асинхронный логгер - простой способ убрать лишние задержки и сделать сервис отзывчивее.
Подписывайся на наш канал в Max
Please open Telegram to view this post
VIEW IN TELEGRAM
👍14🔥6❤5
❓Java Guru - вопросы и задачи с собеседований. Канал с помощью которого ты точно получишь оффер!
👩💻 Android Developer - канал для андроид разработчиков! Статьи, вопросы и задачи с собеседований, лайфхаки.
👩💻 Kotlin Developer - самый топовый канал для котлин разработчика!
📕 Книги для Java программиста - канал с книгами по Java. Постоянно выходят новинки как на русском так и на английском языке!
📰 Java News - канал с последними новостями из мира Java!
📕 Книги для Java программиста - канал с книгами по Java. Постоянно выходят новинки как на русском так и на английском языке!
📰 Java News - канал с последними новостями из мира Java!
Please open Telegram to view this post
VIEW IN TELEGRAM
❤3👍3🔥2😁1
MapStruct — это code-generation библиотека для автоматического маппинга между Java-объектами.
Работает на этапе компиляции, генерирует чистый код без рефлексии — в разы быстрее ModelMapper и Dozer.
Нужно добавить две зависимости: саму библиотеку mapstruct и процессор mapstruct-processor. Процессор отвечает за генерацию кода во время компиляции.
Критически важно правильно настроить maven-compiler-plugin, именно он запускает annotation processors. В секции annotationProcessorPaths прописываем mapstruct-processor, а если используете Lombok, добавляем его тоже плюс специальный binding для их совместной работы.
Создаёте обычный Java-интерфейс с аннотацией @Mapper(componentModel = "spring"). Параметр componentModel указывает, что MapStruct должен сгенерировать Spring-бин, который можно инжектить через конструктор.
В интерфейсе объявляете методы-конвертеры: например UserDto toDto(User user) или List<UserDto> toDtoList(List<User> users). MapStruct сам поймёт, какие поля во что маппить, если названия совпадают.
Когда названия полей отличаются или нужна дополнительная логика, используйте аннотацию @Mapping:
MapStruct умеет автоматически маппить вложенные структуры. Если у вас в User есть поле Address, а в UserDto есть AddressDto — создайте отдельный AddressMapper и укажите его в параметре uses = {AddressMapper.class}.
MapStruct сам найдёт нужный маппер и применит его для вложенных объектов. Это работает рекурсивно для любой глубины вложенности.
Часто нужно не создавать новый объект, а обновить существующий. Для этого используйте аннотацию @MappingTarget на втором параметре метода. MapStruct сгенерирует код, который обновит только нужные поля.
Добавьте @BeanMapping(nullValuePropertyMappingStrategy = NullValuePropertyMappingStrategy.IGNORE) — тогда null-значения из DTO не затрут существующие данные в Entity.
Для сложной логики добавьте в интерфейс default-методы. Пометьте их @Named("имя") и ссылайтесь через qualifiedByName. Например, для конвертации enum в русский текст или склейки нескольких полей.
Можно также создать отдельный класс с @Component и helper-методами, затем подключить его через параметр uses.
MapStruct анализирует ваш интерфейс на этапе компиляции, смотрит на типы полей, их названия и аннотации. Затем генерирует простой Java-код с прямым присвоением значений, никакой магии, рефлексии или proxy.
Сгенерированный код можно открыть и прочитать. Он выглядит так, будто вы написали его вручную. Это упрощает отладку и понимание происходящего.
Подписывайся на наш канал в Max
Please open Telegram to view this post
VIEW IN TELEGRAM
👍13❤4🔥4