12073
Присоединяйтесь к нашему каналу и погрузитесь в мир для Java-разработчика Связь: @devmangx РКН: https://clck.ru/3H4WUg
Java: VarHandle можно использовать как более лёгкую альтернативу volatile. Это строго типизированная ссылка на переменную.
Когда две нити работают с одной и той же переменной, процессор может переупорядочивать операции и кэшировать записи. В результате одна нить обновляет значение, а другая продолжает видеть его старую версию.
#JavaDev
✅ volatile решает эту проблему, обеспечивая полную синхронизацию каждой операции чтения и записи. Это безопасно, но довольно затратно: такой уровень гарантий часто оказывается избыточным и медленнее, чем требуется на практике.VarHandle предоставляет более гибкий и лёгкий механизм благодаря набору специализированных методов.
✅ setRelease — это операция «публикации» значения. Поток-записыватель говорит: «Я закончил. Всё, что я записал до этого момента, теперь безопасно для чтения другими потоками».
Это похоже на нажатие кнопки «Сохранить и опубликовать» для поста.
✅ getAcquire — это операция «подписки» на опубликованные данные.
Она означает: «Дай мне опубликованное значение, и вместе с ним я корректно увижу всё, что было записано до его публикации».
✅ setRelease и getAcquire работают в паре: если поток-читатель увидел флаг, записанный через setRelease, то он гарантированно увидит и все данные, которые были записаны до установки этого флага.
Это обеспечивает необходимую видимость данных между потоками без полной стоимости синхронизации, которую обычно накладывает volatile.
✅ setOpaque — самый дешёвый вариант. Подходит для сценариев с одним потоком-записывателем, когда нужно лишь сохранить порядок собственных операций записи без дополнительных гарантий синхронизации между потоками.
Главное: volatile предоставляет все эти гарантии сразу, но за более высокую цену. VarHandle позволяет выбрать только те гарантии видимости и упорядочивания памяти, которые действительно нужны в конкретном случае.
Демо на GitHub: https://github.com/mcasari/codingstrain/tree/main/x-posts-examples/java-varhandle-fences-demo
👉 Java Portal
Выражения switch в Java 14+ являются исчерпывающими (exhaustive): компилятор проверяет, что обработаны все возможные значения.
✅ Если пропустить константу enum, компиляция завершится ошибкой
✅ Исправить это можно, обработав все значения enum или добавив ветку default
✅ Более безопасный рефакторинг и меньше скрытых ошибок
#Java #JavaDev
👉 Java Portal
💡В Java sealed types позволяют закрыть граф наследования с помощью permits.
Наследоваться от sealed-класса или интерфейса могут только явно перечисленные подтипы.
Каждый разрешённый подтип должен быть объявлен как final, sealed или non-sealed.non-sealed снова открывает возможность наследования ниже по этой ветке. #SoftwareDevelopment
Пример кода, и sample-проект на GitHub:
// java-17-sealed-classes — закрытая иерархия
public abstract sealed class Shape permits Circle, Rectangle, FancyRectangle {
public abstract double area();
}
public final class Circle extends Shape { /* листовой класс — без дальнейшего наследования */ }
public sealed class Rectangle extends Shape permits Square, Oblong { }
public final class Square extends Rectangle { }
public non-sealed class FancyRectangle extends Shape { }
// RoundedRectangle наследуется от FancyRectangle — не указан в Shape.permits (открытая ветка)
Путеводитель по Kafka по Фейнману: https://chemacabeza.dev/writing/the-feynman-guide-to-apache-kafka
#apachekafka
Понимание нервной системы современных data-архитектур.
Сборник ключевых материалов по Kafka, объяснённых через простые аналогии.
👉 Java Portal
Это проблема всех.
Кто ведёт Java-bootcamp, заметили один и тот же паттерн. Люди спокойно пишут код. Но как только нужно что-то запушить на GitHub или, не дай бог, разобраться с merge conflict — они внезапно в панике гуглят “how to undo git”.
Поэтому они сделали курс из 20 уроков, где у тебя прямо в браузере есть настоящий Ubuntu-терминал. Не фейковый sandbox — реальный терминал. Слева урок, справа ты вводишь команды. Никто не пишет код за тебя. Никто не рассказывает лекцию 45 минут по слайдам. Ты просто делаешь всё сам.
Курс проходит путь от нуля до вещей, которые большинство людей вообще никогда не изучают:
Git basics — init, commits, staging, diff’ы, откаты ошибок
Branching — merge, merge conflicts (ты специально вызываешь реальный конфликт и сам его решаешь), rebase
GitHub — push, pull, fork, pull request’ы, code review
Как работают реальные команды — feature branches, conventional commits, protection веток
То, что реально спасает в проде — cherry-pick, reflog, bisect
Spring Boot: в нём есть встроенная поддержка пагинации через Pageable.
В репозиториях стоит использовать пагинацию вместо того, чтобы вытаскивать все данные сразу.
#SpringBoot #JavaDev
👉 Java Portal
Java : Используй инструменты вроде VisualVM, чтобы профилировать свой проект и находить узкие места в производительности. #Java #Performance
👉 Java Portal
Совет по Spring Boot: с Spring Boot и Spring Security вы можете легко защитить эндпоинты.
Чтобы защитить следующий REST endpoint:
@RestController
public class MyController {
@GetMapping("/admin")
public String admin() {
...
}
...
}
@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
http
.authorizeRequests()
.antMatchers("/admin").authenticated()
.anyRequest().permitAll()
.and()
.httpBasic();
}
}
authorizeRequests(): начинает определение эндпоинтов, которые нужно защитить.antMatchers("/admin").authenticated(): требует аутентификацию для /admin.anyRequest().permitAll(): все остальные эндпоинты являются публичными.httpBasic(): включает HTTP Basic-аутентификацию.
Разработчику пригодится это приложение.
Запуск эмулятора iOS или Android за секунды.
Бесплатное, нативное и с открытым исходным кодом:
→ http://minisim.app
👉 Java Portal
Backend interview task:
Разработчик выполнил:
git reset --hard HEAD~1
git reset --hard удаляет ссылку на коммит из текущей ветки, но сам объект коммита обычно ещё остаётся в локальном репозитории.git reflog
abc1234 HEAD@{1}: commit: add payment retry logic
def5678 HEAD@{0}: reset: moving to HEAD~1git reset --hard abc1234
git checkout -b recovery abc1234
😉 Нашел в сети очень подробное руководство по GIT на русском языке
В нем есть все: от клонирования репозиториев до работы с переменными и Pack-файлами
⛓ Ознакомиться: тут
👉 Java Portal
Совет по Java API
Используйте @FunctionalInterface как защиту на уровне компиляции
Она помогает не допустить случайного добавления второго абстрактного метода в интерфейс, который должен быть функциональным.
Если вы попытаетесь добавить ещё один абстрактный метод в такой интерфейс, компилятор выдаст ошибку ☕️
👉 Java Portal
Это тот сайт, который Google должен ставить на первое место по каждому поиску разработчиков.
Он называется IT Tools: https://it-tools.tech/
Бесплатный open-source сайт с 100+ утилитами для разработчиков, которые полностью работают локально в браузере.
JSON formatter
Regex tester
JWT decoder
UUID generator
Cron parser
Timestamp converter
Hash generators
Docker helpers
Color tools
Markdown editor
Всё загружается мгновенно. Нет логинов. Нет трекинга. Нет AI-сгенерированного SEO-мусора.
Когда ищешь один простой конвертер на других сайтах, получаешь:
- всплывающий спам
- трекеры
- фейковые кнопки
- автозапуск видео
- 40 скриптов аналитики
А поскольку сайт полностью open-source, вы можете сами его хостить.
Одна закладка заменила для меня 30+ случайных сайтов.
👉 Java Portal
Spring Boot: spring.main.lazy-initialization=true не только откладывает создание бинов, но и полностью пропускает выполнение @PostConstruct до первого реального использования бина. Учитывайте это и следите за побочными эффектами.
#SpringBoot #SoftwareDevelopment
👉 Java Portal
Понимание кода — одна из больших задач в эпоху ИИ, и именно поэтому один из разрабов JetBrains IDE создал Walkthrough.
Этот экспериментальный плагин предоставляет ИИ-агентам MCP-инструмент, который позволяет пошагово проводить вас по коду прямо в JetBrains IDE в визуальном формате, вместо того чтобы заваливать вас простынями текста.
Заценить можно здесь: https://plugins.jetbrains.com/plugin/31637-walkthrough 😶
👉 Java Portal
Правда или ложь?
1. HTTPS шифрует путь URL и query-параметры ❓
- Правда
При HTTPS шифруется весь HTTP-запрос, включая путь (/api/users) и query-параметры (?id=123). Исключение — доменное имя обычно видно через DNS и TLS-метаданные (если не используется ECH).
2. Транзакция в БД автоматически блокирует всю таблицу ❓
- Ложь
В большинстве современных СУБД используются строчные (row-level) или более гранулярные блокировки. Блокировка всей таблицы происходит лишь в некоторых сценариях.
3. Данные Redis теряются при перезапуске сервера ❓
- Ложь
Redis может сохранять данные через RDB-снимки и AOF-журналирование. Без настроенной персистентности данные действительно будут потеряны.
4. async/await в Node.js выполняет код параллельно ❓
- Ложьasync/await упрощает работу с асинхронным кодом, но само по себе не создаёт параллелизм. Оно лишь ожидает завершения Promise. Для реального параллельного выполнения нужно запускать несколько операций одновременно (например, через Promise.all()).
5. Ответ 304 Not Modified не содержит тела ❓
- Правда
Статус 304 Not Modified сообщает клиенту использовать закэшированную версию ресурса, поэтому тело ответа отсутствует.
6. Внешние ключи (Foreign Keys) улучшают производительность запросов ❓
- Ложь
Основная задача внешних ключей — обеспечение ссылочной целостности. Они не ускоряют запросы сами по себе. Более того, проверки FK могут добавлять накладные расходы при записи данных.
7. Docker-контейнеры используют общее ядро ОС хоста ❓
-Правда
Контейнеры изолированы через namespaces и cgroups, но используют одно и то же ядро хостовой системы.
8. JWT-токены по умолчанию зашифрованы ❓
- Ложь
Обычный JWT (JWS) подписан, но не зашифрован. Любой может декодировать его содержимое через Base64URL. Для шифрования используется JWE, но это отдельный механизм.
👉 Java Portal
Лучшие GitHub-репозитории для изучения system design без покупки курсов за $400:
1. System Design Primer github.com/donnemartin/sy
2. Awesome System Design Resources github.com/ashishps1/awes
3. System Design 101 github.com/ByteByteGoHq/s
4. Designing Data-Intensive Applications Notes github.com/Vonng/ddia
5. System Design Interview github.com/checkcheckzz/s
6. The Book of Secret Knowledge github.com/trimstray/the-
7. Awesome Scalability github.com/binhnguyennus/
8. Low Level Design Primer github.com/prasadgujar/lo
9. Tech Interview Handbook github.com/yangshun/tech-
👉 Java Portal
Изучение внутреннего устройства Git — это одна из топ-5 вещей, которые разработчик может сделать для себя.
Вся суть Git внезапно сводится к коммитам в ветках, и тогда становится видно, насколько Git красив и прост по своей сути.
- rebase — это просто пересоздание коммитов на новой базе
- cherry-pick — это просто повторное применение изменений одного коммита
- merge — это просто соединение историй
- reset — это просто перемещение текущего ref’а
На самом деле это одна из самых красивых систем, когда-либо созданных.
👉 Java Portal
map vs flatMapmap() — преобразует каждый элемент, сохраняя исходную структуруflatMap() — преобразует элементы и одновременно разворачивает (flatten) результат
Используйте flatMap, когда функция преобразования возвращает Stream или коллекциюflatMap «распаковывает» вложенные потоки в один плоский поток
Если вы получили Stream<Stream<T>>, а ожидали Stream<T>, вам нужен flatMap!
// map
Stream<List<Integer>>
// flatMap
Stream<Integer>
map() создаёт вложенную структуру, а flatMap() её разворачивает.
Включить reflection-free Jackson в Quarkus — легко. Настоящая работа начинается с того, чтобы понять, сохраняется ли ваш JSON-контракт.
Автор собрал небольшой API каталога с DTO на record-классах, обобщённым Page<T>, полиморфными payload-ами, кастомным сериализатором и контрактными тестами: baseline против reflection-free режима.
#java #quarkus
👉 Java Portal
4 способа обновления данных в веб-приложении на стороне клиента в реальном режиме времени: коротки и долгий опрос, SSE и веб-сокеты
👉 Java Portal
На Stepik запустили мощный курс по «Troubleshooting Docker и Kubernetes: поиск и устранение проблем»
В программе только важные аспекты:
— troubleshooting Docker и образов
— диагностика сетевых проблем
— настройка readiness/liveness probes
— отладка pod’ов, деплоев и ingress
— анализ логов контейнеров и кластера
— разбор ошибок CrashLoopBackOff, OOMKilled, ImagePullBackOff и других
Собеседования на DevOps/SRE сейчас всё чаще строятся вокруг реальных инцидентов. Данный курс фокусируется именно на таких сценариях и помогает в подготовке к практическим вопросам
48 часов доступен со скидкой 25%
↗️ Пройти курс на Stepik
Большинство разработчиков даже не знают, что GitHub умеет рендерит анимации прямо в README.
github.com/LottieFiles/do github.com/LottieFiles/do github.com/LottieFiles/do github.com/thorvg/thorvg/
👉 Java Portal
Совет по Java: ловите ошибки ещё на этапе компиляции — помечайте переопределённые методы аннотацией @Override.
@Override
public void process() {
// logic
}
Важная Java-библиотека: Jackson
Джексон — высоконастраиваемый, быстрый, поддерживает стриминг и является процессором JSON с биндингом данных. Если работаешь с JSON, эту библиотеку нужно знать.
Какие основные модули у Джексона?
jackson-core — низкоуровневый стриминговый API (JsonParser, JsonGenerator) для эффективного чтения и записи JSON
jackson-databind — содержит ObjectMapper, основной API для конвертации между Java-объектами и JSON
jackson-annotations — аннотации (@JsonProperty, @JsonIgnore и др.), управляющие сериализацией/десериализацией
jackson-dataformat-* — расширения для форматов XML, CSV, YAML, CBOR и др.
jackson-datatype-* — поддержка типов Java 8 Date/Time (LocalDate, Instant), Guava, JodaTime и др.
jackson-module-* — модули-расширения под конкретные языки и оптимизации производительности (например, Kotlin, Afterburner)
👉 Java Portal
Spring Boot: Добавление ID трассировки запросов важно для отладки API
#SpringBoot #JavaDev
👉 Java Portal
Как выбрать шаблон проектирования?
Выбор подходящего шаблона проектирования в программной инженерии — ключ к эффективному решению задач. Этот гайд упрощает процесс выбора, помогая принимать обоснованные решения в зависимости от конкретных потребностей.
В нём даны краткие описания и практические случаи использования каждого шаблона, что облегчает их понимание и применение в реальных проектах.
Чтобы выбрать шаблон, сначала необходимо определить тип проблемы:
> Создание объектов? → Порождающие шаблоны
> Компоновка объектов? → Структурные шаблоны
> Взаимодействие объектов? → Поведенческие шаблоны
Приступим.
1. Порождающие шаблоны
> Singleton — используется, когда нужен единственный экземпляр класса. Примеры: логгирование, подключения к базе данных.
> Factory Method — отделяет создание объекта от его использования. Пример: создание разных типов подключений к БД на основе конфигурации.
> Abstract Factory — создаёт семейства связанных объектов. Пример: парсеры для разных форматов файлов.
> Builder — пошаговое создание сложных объектов. Пример: построение сложного объекта доменной модели.
> Prototype — создание копий объектов и повторное использование закэшированных экземпляров для снижения количества запросов к БД.
2. Структурные шаблоны
> Adapter — делает несовместимые интерфейсы совместимыми. Пример: подключение новой библиотеки логгирования к системе с другим интерфейсом.
> Composite — представление иерархий "часть-целое". Пример: графические объекты в редакторе, объединяемые в группы.
> Proxy — управление доступом к объекту. Пример: ленивое подключение изображения высокого разрешения.
> Decorator — динамическое добавление/удаление поведения. Пример: добавление сжатия или шифрования для потоков файлов.
> Bridge — разделение абстракции и реализации. Пример: изоляция платформозависимого кода от основной логики.
3. Поведенческие шаблоны
> Strategy — определяет семейство алгоритмов. Пример: выбор между различными алгоритмами сортировки или сжатия.
> Observer — оповещение об изменениях состояния. Пример: уведомление подписчиков о событиях в системе сообщений.
> Command — инкапсулирует запрос как объект. Пример: реализация undo/redo в текстовом или графическом редакторе.
> State — инкапсулирует поведение в зависимости от состояния. Пример: разные состояния UI-элемента (вкл., выкл., выделен).
> Template Method — задаёт скелет алгоритма, позволяя подклассам реализовать отдельные шаги. Пример: базовый класс для юнит-тестов с переопределяемыми шагами подготовки и очистки.
В итоге мы подбираем тот шаблон, который наилучшим образом решает конкретную задачу
👉 Java Portal
Java 8: мастерство работы с «разворачивающим отображением» — самая важная операция потоков, с которой у разработчиков чаще всего возникают сложности
Многие разработчики понимают операции отображения и фильтрации, но «разворачивающее отображение» вызывает наибольшую путаницу. Эта операция особенно мощная при работе со вложенными коллекциями, списками списков, значениями-обертками, а также ответами API, которые возвращают коллекции. Освоение этого подхода помогает писать более чистый и эффективный код и уходить от вложенных циклов.
👉 Java Portal
Иерархия потоков ввода-вывода в Java
👉 Java Portal
Spring Boot: с @RestControllerAdvice можно глобально обрабатывать конкретные типы исключений вместо того, чтобы разбрасывать try/catch по всему коду.
#SpringBoot #SoftwareEngineering
👉 Java Portal