👀 Внутреннее устройство CopyOnWriteArrayList
CopyOnWriteArrayList — это потокобезопасная коллекция из пакета java.util.concurrent, которая реализует интерфейсы List и RandomAccess. Она часто воспринимается как «волшебная таблетка» для многопоточности, но под капотом это хитрая стратегия: каждое изменение списка создаёт копию массива.
📦 Базовая структура
Внутри CopyOnWriteArrayList хранит данные в обычном массиве
— Все операции чтения (get, iterator, contains) идут напрямую по этому массиву и не требуют синхронизации.
— При модификациях (add, remove, set) создаётся новый массив с учётом изменений, и ссылка array указывает на него.
За счёт этого чтения не блокируются, а итераторы всегда видят снимок состояния (snapshot) на момент создания.
⚡️ Добавление и удаление
— add(E e): берётся текущий массив, копируется в новый на +1 элемент, в конец добавляется e.
— remove(Object o): копия массива создаётся без указанного элемента.
— set(int index, E element): создаётся копия массива, в которой меняется один элемент.
Сложность таких операций — O(n), ведь нужно копировать массив.
🌊 Итераторы
— Итератор у CopyOnWriteArrayList не fail-fast, в отличие от ArrayList и LinkedList.
— Он работает по «снимку» массива, который существовал в момент вызова iterator().
— Изменения, сделанные другими потоками, в процессе обхода не видны.
📊 Производительность
— Чтение (get, contains, iteration) → O(1) / O(n) для поиска очень быстро, так как обращение к массиву.
— Запись (add, remove, set) → O(n), так как требуется копировать массив.
— Итерация → O(n), но без блокировок и с высокой стабильностью в многопоточной среде.
⚖️ Важные нюансы
— CopyOnWriteArrayList идеален для сценариев «много чтений, мало записей».
— Память расходуется щедро: каждый апдейт порождает новую копию массива.
— Если записи происходят часто, использование становится неоправданным.
🧮 Когда использовать
— Подписчики/слушатели событий (например, listeners в UI или логгере).
— Кэш статических данных, где обновления редки.
— Конфигурации, которые меняются редко, а читаются часто.
В большинстве остальных случаев лучше использовать другие структуры (ConcurrentHashMap, Collections.synchronizedList, CopyOnWriteArraySet).
🔗 Документация: официальная JavaDoc (Java 17)
Ставьте 🔥, если хотите такой же пост по другим коллекциям. Пишите в комменты, какую коллекцию разобрать следующей.
🐸 Библиотека джависта
#CoreJava
CopyOnWriteArrayList — это потокобезопасная коллекция из пакета java.util.concurrent, которая реализует интерфейсы List и RandomAccess. Она часто воспринимается как «волшебная таблетка» для многопоточности, но под капотом это хитрая стратегия: каждое изменение списка создаёт копию массива.
📦 Базовая структура
Внутри CopyOnWriteArrayList хранит данные в обычном массиве
transient volatile Object[] array
.— Все операции чтения (get, iterator, contains) идут напрямую по этому массиву и не требуют синхронизации.
— При модификациях (add, remove, set) создаётся новый массив с учётом изменений, и ссылка array указывает на него.
За счёт этого чтения не блокируются, а итераторы всегда видят снимок состояния (snapshot) на момент создания.
⚡️ Добавление и удаление
— add(E e): берётся текущий массив, копируется в новый на +1 элемент, в конец добавляется e.
— remove(Object o): копия массива создаётся без указанного элемента.
— set(int index, E element): создаётся копия массива, в которой меняется один элемент.
Сложность таких операций — O(n), ведь нужно копировать массив.
🌊 Итераторы
— Итератор у CopyOnWriteArrayList не fail-fast, в отличие от ArrayList и LinkedList.
— Он работает по «снимку» массива, который существовал в момент вызова iterator().
— Изменения, сделанные другими потоками, в процессе обхода не видны.
📊 Производительность
— Чтение (get, contains, iteration) → O(1) / O(n) для поиска очень быстро, так как обращение к массиву.
— Запись (add, remove, set) → O(n), так как требуется копировать массив.
— Итерация → O(n), но без блокировок и с высокой стабильностью в многопоточной среде.
⚖️ Важные нюансы
— CopyOnWriteArrayList идеален для сценариев «много чтений, мало записей».
— Память расходуется щедро: каждый апдейт порождает новую копию массива.
— Если записи происходят часто, использование становится неоправданным.
🧮 Когда использовать
— Подписчики/слушатели событий (например, listeners в UI или логгере).
— Кэш статических данных, где обновления редки.
— Конфигурации, которые меняются редко, а читаются часто.
В большинстве остальных случаев лучше использовать другие структуры (ConcurrentHashMap, Collections.synchronizedList, CopyOnWriteArraySet).
Ставьте 🔥, если хотите такой же пост по другим коллекциям. Пишите в комменты, какую коллекцию разобрать следующей.
#CoreJava
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥17👍4❤1👏1🤔1
Please open Telegram to view this post
VIEW IN TELEGRAM
😁32👍4🌚2👏1🤩1
Please open Telegram to view this post
VIEW IN TELEGRAM
😁18❤13👍3💯2
🔥 Коллеги, годный практикум по микросервисной архитектуре!
По шагам — чем «учебный» монолит отличается от продакшна:
— observability-стек 👀 (Grafana/Prometheus/Loki/Tempo/Alloy),
— распределённые транзакции по Saga 🔄 (оркестрация/хореография),
— безопасность на Keycloak 🔐,
— API Gateway, OpenAPI + codegen 🚪 (DTO/Feign),
— инфраструктура на Docker Compose + Makefile + Nexus 🐳.
В конце — полный прогон: Docker → Postman → метрики/трейсы в Grafana.
▶️ Смотреть: Основы работы с микросервисами
P.S. У автора — техканал с продолжением темы: https://t.me/esuleimanov 🤓
По шагам — чем «учебный» монолит отличается от продакшна:
— observability-стек 👀 (Grafana/Prometheus/Loki/Tempo/Alloy),
— распределённые транзакции по Saga 🔄 (оркестрация/хореография),
— безопасность на Keycloak 🔐,
— API Gateway, OpenAPI + codegen 🚪 (DTO/Feign),
— инфраструктура на Docker Compose + Makefile + Nexus 🐳.
В конце — полный прогон: Docker → Postman → метрики/трейсы в Grafana.
▶️ Смотреть: Основы работы с микросервисами
P.S. У автора — техканал с продолжением темы: https://t.me/esuleimanov 🤓
👍6🤔2❤1😁1
Forwarded from Библиотека задач по Java | тесты, код, задания
Что будет результатом кода?
Anonymous Quiz
26%
Значение меньше 2000
44%
Всегда 2000
5%
Ошибка компиляции
11%
ConcurrentModificationException
14%
Посмотреть ответ
👍5❤1🔥1
⚡️ Просто о сложном: JIT-компилятор
Чтобы ускорить работу приложения, JVM включает в дело Just-In-Time (JIT) компилятор.
Он превращает часто выполняемый байткод в нативные машинные инструкции прямо во время исполнения.
🔹 Как это работает
— При старте приложения JVM интерпретирует байткод.
— Когда видит, например, что метод вызывается часто (т.н. hot method), — JIT компилирует его в машинный код.
— В следующий раз этот метод исполняется уже как нативный, без интерпретации.
— Всё это происходит «на лету» — поэтому Java-программы разгоняются после первых секунд работы.
🔹 Зачем нужен JIT
Он сочетает плюсы интерпретации и компиляции:
— Быстрый старт приложения (интерпретация).
— Высокая производительность после разогрева (JIT).
🔹 Что он умеет оптимизировать
— Inlining: подставляет код мелких методов прямо в место вызова.
— Escape Analysis: определяет, можно ли объект хранить на стеке вместо heap.
— Loop unrolling: разворачивает циклы для ускорения.
— Dead code elimination: выбрасывает ненужные операции.
— И другие алгоритмы.
⚙️ Как посмотреть, что делает JIT
Включите флаг:
И увидите, какие методы компилируются во время исполнения.
Интересно почитать про алгоритмы JIT подробнее → ставь 👾
🐸 Библиотека джависта
#CoreJava
Чтобы ускорить работу приложения, JVM включает в дело Just-In-Time (JIT) компилятор.
Он превращает часто выполняемый байткод в нативные машинные инструкции прямо во время исполнения.
🔹 Как это работает
— При старте приложения JVM интерпретирует байткод.
— Когда видит, например, что метод вызывается часто (т.н. hot method), — JIT компилирует его в машинный код.
— В следующий раз этот метод исполняется уже как нативный, без интерпретации.
— Всё это происходит «на лету» — поэтому Java-программы разгоняются после первых секунд работы.
🔹 Зачем нужен JIT
Он сочетает плюсы интерпретации и компиляции:
— Быстрый старт приложения (интерпретация).
— Высокая производительность после разогрева (JIT).
🔹 Что он умеет оптимизировать
— Inlining: подставляет код мелких методов прямо в место вызова.
— Escape Analysis: определяет, можно ли объект хранить на стеке вместо heap.
— Loop unrolling: разворачивает циклы для ускорения.
— Dead code elimination: выбрасывает ненужные операции.
— И другие алгоритмы.
Включите флаг:
-XX:+PrintCompilation
И увидите, какие методы компилируются во время исполнения.
Интересно почитать про алгоритмы JIT подробнее → ставь 👾
#CoreJava
Please open Telegram to view this post
VIEW IN TELEGRAM
👾26👍4🔥3
🛰 Event-Driven Architecture с Apache Kafka
Монолиты и REST-взаимодействие упираются в масштабируемость. Event-driven архитектура с Kafka позволяет строить реактивные цепочки бизнес-логики, где события становятся мостом между сервисами.
📝 Промпт:
💡 Расширения:
— Настройте Kafka Streams для real-time агрегатов.
— Интегрируйте с Schema Registry для версионирования событий.
— Добавьте Observability: trace event flow with OpenTelemetry.
🐸 Библиотека джависта
#Enterprise
Монолиты и REST-взаимодействие упираются в масштабируемость. Event-driven архитектура с Kafka позволяет строить реактивные цепочки бизнес-логики, где события становятся мостом между сервисами.
📝 Промпт:
Generate a Spring Boot 3 microservice architecture example with Apache Kafka event-driven communication.
— Configure Kafka producer and consumer with Spring Kafka.
— Use JSON Schema/Avro for message serialization and schema validation.
— Implement a domain event publisher (e.g. OrderCreatedEvent).
— Add event listener services that react asynchronously (e.g. notification service, billing service).
— Implement idempotency strategy for consumers (deduplication of events).
— Use Kafka Transactions for exactly-once semantics.
— Add Dead Letter Queue (DLQ) handling for failed messages.
— Настройте Kafka Streams для real-time агрегатов.
— Интегрируйте с Schema Registry для версионирования событий.
— Добавьте Observability: trace event flow with OpenTelemetry.
#Enterprise
Please open Telegram to view this post
VIEW IN TELEGRAM
👍5🔥2👏1
Топ-3 статьи о Java и смежных технологиях за неделю по версии нашего канала.
Крупное обновление фреймворка. Теперь требуется Java 17+, все модули объединены в единую версию, устаревшие API удалены, добавлены аннотации JSpecify для строгой null-безопасности.
Мощное расширение IDE для Spring-проектов. Позволяет генерировать CRUD-код, миграции, OpenAPI и управлять сущностями прямо из IDE.
Статья о том, почему стоит смотреть в сторону Kotlin: меньше шаблонного кода, выше читаемость и меньше ошибок. Kotlin даёт прирост скорости и лаконичности, особенно для команд, уставших от громоздкости Java.
#News
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥5👏2👍1
Anonymous Poll
32%
Без Lombok писать больно
7%
Удаляю Lombok из всех проектов
29%
Только для DTO и простых моделей
33%
Зависи от команды, проекта и кодстайла
🔥4❤1👍1💯1
Forwarded from Библиотека собеса по Java | вопросы с собеседований
Продолжаем тестить новый формат. Представим задачу 👇
У вас есть Spring Boot-приложение. Нужно собрать Docker-образ, который:
1. Основан на официальном JDK 21
2. Поддерживает порт 8080
3. Настраивает часовой пояс контейнера на Москву (Europe/Moscow)
📦 Задание:
Составьте Dockerfile, который корректно запускает приложение в контейнере по условиям выше.
Ставьте →🔥, если зашёл формат. Если нет, то → 🤔
#practise
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥14👍2👏1😁1
Наш подписчик спрашивает:
Я изучаю Java уже около полугода, сделал небольшой pet-project на Spring Boot, немного HTML/CSS/JS. Сейчас ищу первую работу джуном. Хочу понять, как лучше подготовиться к интервью: на какие темы стоит сделать упор, какие вопросы чаще всего задают и что вообще ожидают от кандидата на стартовую позицию?
🔹 Что думаете?
— Какие темы реально спрашивали у вас на собеседовании джуна
— Что чаще всего «проваливают» начинающие (и как этого избежать)
— Какой совет вы бы дали себе в тот момент, когда шли на первое интервью
P.S. Если хотите задать вопрос, заполните нашу гугл-форму. Это займет 5 минут.
#DevLife
Please open Telegram to view this post
VIEW IN TELEGRAM
🤩7❤2👍1🔥1😁1
Выходные прошли, надеюсь все успели отдохнуть. Наблюдал сегодня красивое закатное небо 😍
Как прошли ваши выходные?
Отправляйте фото в комментарии👇🏻
#DevLife
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥5😍2👍1