Паттерны применения многопоточности на коммерческом проекте (на примере Java)
Многопоточность неразрывно связана с отзывчивостью вашего приложения под нагрузкой. Если нагрузки нет, скажем 5 запросов в час, то и о многопоточности можно особо не задумываться
На коммерческих проектах чаще встречается ситуация, когда вашим приложением пользуются сотни и даже тысячи клиентов одновременно, в такие моменты без многопоточности никуда, при этом приложение должно работать эффективно, не расходуя лишние ресурсы
Я собрал самые часто встречаемые паттерны работы с многопоточностью из своей практики, которые помогают писать отказоустойчивые и надежные приложения
В данной статье будем рассматривать многопоточность без применения webflux, однако если будет спрос, то распишу те же паттерны на webflux'е, там они выглядят более органично
Также не буду затрагивать Project Loom, поскольку мне не приходилось отлаживать и поддерживать код с использованием Loom на коммерческом проекте (Java 21 еще не используем), но когда-нибудь я напишу подробную и понятную статью по Loom
👩💻 Открытый урок «Знакомство со Spring Cloud».
Как эффективно использовать самый популярный фреймворк в Java-мире для профессиональной разработки приложений?
📆 Узнайте на открытом вебинаре 10 октября в 20:00 мск.
Где мы разберем:
- что такое Spring Cloud и для чего он нужен;
- из каких основных компонентов состоит Spring Cloud;
- как использовать ключевые функции Spring Cloud для разработки.
Спикер Сергей Петрелевич — опытный Java/Kotlin-разработчик и преподаватель.
Встречаемся в преддверии старта курса «Java Developer. Professional». Все участники вебинара получат специальную цену на обучение!
👉 Регистрируйтесь прямо сейчас, чтобы не пропустить мероприятие: https://vk.cc/cBMqaLРеклама. ООО «Отус онлайн-образование», ОГРН 1177746618576
Осень — время новых знаний! 👨🎓
И мы знаем, где будут прокачивать свои hard и soft skills IT-специалисты — на IT Community Day, который Сбер проведёт сразу в трёх городах:
✔️ В Санкт-Петербурге 5 октября обсудим искусственный интеллект, возможности фронтенда, новую среду разработки и мотивацию для айтишников.
✔️ В Казани 12 октября научимся управлять большими данными, укрощать искусственный интеллект, создавать успешное резюме и находить подход к карьере.
✔️ В Екатеринбурге 19 октября поговорим об интеграции LLM в приложение, методологии API-first и комбинации личного и профессионального развития.
Во всех городах вас будут ждать топовые спикеры, а после докладов — afterparty. Регистрируйтесь на IT Community Day в Санкт-Петербурге, Казани и Екатеринбурге👌
Хотите узнать, чем Clojure выделяется среди других бэкендовых языков и что он может вам предложить?
Ждем вас на открытом вебинаре 3 октября в 20:00 мск, где мы разберем:
- с какими задачами сталкиваются разработчики Clojure;
- основные особенности и преимущества Clojure по сравнению с другими языками;
- какие возможности и перспективы предлагает Clojure для разработчиков.
Встречаемся в преддверии старта курса «Clojure Developer». Все участники вебинара получат специальную цену на обучение!
Регистрируйтесь прямо сейчас, чтобы не пропустить мероприятие: https://vk.cc/cBI8Ue
Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576, www.otus.ru
Какие бывают строковые классы?
В Java строковые классы — это классы, которые используются для работы со строками, то есть последовательностями символов. Основные строковые классы в Java:
1. String
- Неизменяемый класс (immutable): После создания объекта String
его нельзя изменить.
- Использование: Широко используется для представления строковых значений.
- Особенности:
- Строки могут быть созданы с использованием строковых литералов или через конструктор.
- Для сравнения строк рекомендуется использовать метод equals()
, а не оператор ==
.
- Пример:
String str = "Hello, World!";
StringBuilder sb = new StringBuilder("Hello");
sb.append(", World!");
StringBuilder
, позволяет изменять строки.StringBuilder
.
StringBuffer sb = new StringBuffer("Hello");
sb.append(", World!");
String
, StringBuilder
и StringBuffer
:String
неизменяемый, тогда как StringBuilder
и StringBuffer
изменяемы.StringBuffer
синхронизирован, в отличие от StringBuilder
.StringBuilder
быстрее, чем StringBuffer
при работе в однопоточных средах.Оптимизация строк в Java
В Java строки (`String`) являются объектами, представляющими последовательность символов. Они имеют особое значение в языке, и оптимизация работы со строками важна для эффективного использования памяти и производительности приложения. Вот ключевые аспекты и методы оптимизации работы со строками в Java:
1. Пул строк (String Pool)
- Java использует специальную область памяти, называемую String Pool (или **интернированный пул строк**), для хранения строковых литералов.
- Когда строка создается как литерал, например, String str = "hello";
, JVM сначала проверяет, есть ли уже такая строка в пуле. Если есть, то возвращается ссылка на существующую строку, а не создается новый объект.
- Если строка создается с помощью new
, например, String str = new String("hello");
, новый объект строки создается в куче, даже если такая строка уже есть в пуле.
Оптимизация:
- Используйте строковые литералы вместо явного создания новых объектов String
через new
, чтобы JVM могла переиспользовать строки из пула.
Пример:
String s1 = "hello"; // переиспользует строку из пула
String s2 = new String("hello"); // создает новую строку в куче
intern()
добавляет строку в пул строк, если ее там еще нет, и возвращает ссылку на строку из пула.
String s1 = new String("hello").intern(); // добавляет строку в пул и возвращает ссылку из пула
String s2 = "hello"; // использует строку из пула
System.out.println(s1 == s2); // true
+
в Java создает новые объекты String
, поскольку строки неизменяемы. Это может привести к большому количеству временных объектов и снижению производительности.StringBuilder
или StringBuffer
для конкатенации строк, если вы собираете строки в цикле.
// Плохой подход:
String result = "";
for (int i = 0; i < 1000; i++) {
result += i; // каждый раз создается новая строка
}
// Оптимизированный подход:
StringBuilder builder = new StringBuilder();
for (int i = 0; i < 1000; i++) {
builder.append(i); // строка накапливается без создания временных объектов
}
String result = builder.toString();
StringBuffer
синхронизирован, и это делает его потокобезопасным, но добавляет накладные расходы. Для однопоточных операций лучше использовать несинхронизированный StringBuilder
, который работает быстрее.
String str = "hello";
char[] charArray = str.toCharArray();
charArray[0] = 'H'; // изменяем символ
String modifiedStr = new String(charArray); // создаем новую строку
String.join()
или Collectors.joining()
для оптимизации вместо ручной конкатенации.
List<String> list = Arrays.asList("one", "two", "three");
String result = String.join(", ", list); // более эффективное объединение строк
Преобразование коллекций
Новичкам зачастую трудно представить выгоду от использования Stream API вместо обычных циклов. Приведем несколько примеров, которые позволят вам сделать код лаконичнее.
👉@BookJava
Используйте плагин checkstyle
Подключить его очень легко и в Gradle, и в Maven.plugins {
id 'checkstyle'
Плагин проверяет форматирование, неиспользуемые импорты и когнитивную сложность ваших методов при каждой сборке приложения, что помогает поддерживать ваш код удобочитаемым, а следовательно, лучше сопровождаемым.
👉@BookJava
👩💻 Курс для Java-разработчиков, которые хотят профессионального роста.
Пройди тест по Java и проверь свои знания, готов ли ты к обучению на курсе.
Ответишь — пройдешь на продвинутый курс "Java Developer. Professional" от OTUS по специальной цене + получишь доступ к записям открытых уроков курса курса
➡️ ПРОЙТИ ТЕСТ: https://vk.cc/cBhSQQРеклама. ООО «Отус онлайн-образование», ОГРН 1177746618576, www.otus.ru
Тестовое собеседование на Middle Java-разработчика завтра
Уже завтра, 25 сентября в 19:00 по мск приходи онлайн на открытое собеседование, чтобы посмотреть на настоящее интервью на Middle Java-разработчика.
Как это будет:
1. Мария Ядерцова ведущий Java-разработчик в МТС Диджитал и ex. Сбербанк-Технологии будет задавать реальные вопросы и задачи разработчику-добровольцу
2. Мария будет комментировать каждый ответ респондента, чтобы дать понять чего от вас ожидает собеседующий на интервью
3. В конце можно будет задать любой вопрос Марии
Что узнаешь на прямом эфире от ШОРТКАТ:
· Чего ждут от кандидатов на Middle позиции в Java-разработке
· Какие вопросы задают на интервью и зачем
· Как подготовиться к собесу, чтобы получить оффер
Это бесплатно? Бесплатно
Переходи в нашего бота, чтобы получить ссылку на эфир → @shortcut_sh_bot
Реклама. ООО "ШОРТКАТ", ИНН: 9731139396, erid: 2VtzqvfZr2U
Разница orElse() vs orElseGet()
Многим программистам, которые только начинают работать с Optional или Java 8, разница между orElse() и orElseGet()
непонятна. Однако между ними есть тонкое, но важное различие:
А) Вариант с orElse()
. При выполнении метода в консоль выведется 'Getting Default Value', несмотря на то, что объект в Optional присутствует.
Б) При использовании orElseGet()
для извлечения обернутого значения метод getDefaultValue()
не вызывается, поскольку содержащееся значение присутствует.
Таким образом, в первом случае мы просто создали один лишний объект, который никогда не используется, что может оказать влияние на производительность.
👉@BookJava
Используйте Lombok осознанно
Использование Lombok значительно упрощает код, однако, не смотря на то, что мы используем аннотации вместо того, чтобы писать код вручную, генерируемый код также будет являться частью нашего приложения и его нужно сопровождать, а значит, используя аннотацию, мы должны четко понимать, какой именно код будет сгенерирован.
Например, используя аннотацию @Data
мы должны помнить, что она включает в себя аннотацию @EqualsAndHashCode
, которая по умолчанию использует в методе hashCode все атрибуты класса. А если какой-то из атрибутов ссылается на наш класс, это может привести к бесконечной рекурсии.
👉@BookJava
Принципы SOLID в Java с примерами
Принципы SOLID - это набор из пяти принципов проектирования в объектно-ориентированном программировании, которые помогают разработчикам создавать более удобное, понятное и гибкое программное обеспечение. Эти принципы были введены Робертом К. Мартином, также известным как Дядя Боб. SOLID означает:
1 - Single Responsibility Principle (SRP)
2 - Open/Closed Principle (OCP)
3 - Liskov Substitution Principle (LSP)
4 - Interface Segregation Principle (ISP)
5 - Dependency Inversion Principle (DIP)
https://www.javaguides.net/2020/01/solid-principles-in-java-with-examples.html
👉@BookJava
Опыт отладки хитрой утечки прямой памяти
Pinterest поддерживает формирование отчётов по метрикам рекламных объявлений внешних рекламодателей и расчёт рекламных бюджетов в реальном времени. Всё это основано на потоковых конвейерах обработки данных, созданных с помощью на Apache Flink. Доступность заданий (job) Flink для пользователей находится на уровне 99-го перцентиля. Но время от времени некоторые задачи (task) «валятся» под ударами неприятных ошибок, вызванных утечками прямой памяти (Out-Of-Memory, OOM), возникающими сразу в нескольких операторах.
https://habr.com/ru/companies/wunderfund/articles/843618/
👉@BookJava
Ultimate Java Developer Roadmap 2024
https://www.rameshfadatare.com/learn-java-programming/
👉@BookJava
Создание REST API с использованием Spring WebFlux и Security
00:00:00 Введение
00:00:20 Создание проекта
00:11:36 Создание миграций БД
00:15:40 Создание базовых классов
00:23:20 Реализация логики генерации JWT токена
00:46:30 Реализация логики валидации JWT токена
00:53:05 Построения цепочки аутентификации
01:04:22 Финальная конфигурация с использованием SecurityWebFilterChain
01:12:11 Реализация REST контроллеров
01:23:15 Проверка REST API средствами Postman
01:24:21 Добавление и конфигурация обработчика ошибок
01:25:40 Заключение
Ссылка на Github репозиторий https://github.com/proselytear/webfluxsecurity
источник
👉@BookJava
Как заставить code coverage работать на вас
Недавно я снова услышал тезис, что code coverage не нужен и совсем не обязательно за ним следить, а нужно просто делать black-box тесты и считать количество тест-кейсов. Я не согласен с подобного рода категоричными утверждениями. В этой статье постараюсь изложить свою точку зрения и развеять некоторые мифы, опираясь на свой опыт в разработке и идеи, которые почерпнул из книг и статей других инженеров.
https://habr.com/ru/articles/836366/
👉@BookJava
Spring Boot 3 🍃 включает несколько улучшений в области SSL 🔐
🔹3.1 - SSL Bundles
🔹3.2 - SSL Hot Reload
🔹3.4 - SSL certs info in the 'info' and 'health' Actuator endpoints
Чтобы включить SSL в 'info
' endpoint, установите свойство "http://management.info.ssl.enabled=true
"
👉@BookJava
🚀 Совет по Java - Comparator 🚀Comparator.nullsLast
Принимает Comparator в качестве аргумента, который отвечает за сравнение ненулевых элементов. В случае, если переданный компаратор равен null, ненулевые значения считаются равными. 🔥
https://docs.oracle.com/en/java/javase/22/docs/api/java.base/java/util/Comparator.html#nullsLast(java.util.Comparator)
👉@BookJava
🏓 Знакомимся с Java на примере пинг-понга
Хотите узнать, как создавать программы на Java, даже если никогда не программировали?
Ждем вас на открытом вебинаре 26 сентября в 20:00 мск,
где мы разберем:
➡️ что такое программирование и язык Java;
➡️ как создать игру пинг-понг с нуля на Java;
➡️ как работать с двумерной графикой в Java.
Урок полезен для тех, кто хочет начать изучать Java с нуля и увидеть на практике, как создаются приложения.
🎙 Спикер Александр Фисунов — Senior Kotlin Developer в SSP Software на проекте ВТБ, опытный Java-разработчик и кандидат технических наук.
Встречаемся в преддверии старта курса «Специализация Java-разработчик».
Все участники вебинара получат специальную цену на обучение!
➡️ Регистрируйтесь прямо сейчас, чтобы не пропустить мероприятие: https://vk.cc/cBp05HРеклама. ООО «Отус онлайн-образование», ОГРН 1177746618576, www.otus.ru
Присоединяйся к всероссийскому чемпионату по программированию МТС True Tech Champ 2024 с призовым фондом в 10 250 000 ₽. Решай алгоритмические задачи или программируй роботов.
Какие задания и этапы ждут участников, расскажут на вводном вебинаре создатели треков 26 сентября в 17:00. Регистрируйся по ссылке.
В чемпионате найдутся задачи для начинающих ИТ-специалистов и опытных разработчиков.
✔️ В алгоритмическом треке участники будут работать со структурами данных, покажут математические навыки и умение решать алгоритмические задачи.
✔️ В треке по программированию роботов нужно будет соревноваться на скорость прохождения лабиринта робомышью.
Подробнее о чемпионате — по ссылке.
Регистрация участников: до 12 октября
Старт онлайн-этапов: с 1 октября
Финал в офлайне: 8 ноября
👩💻 Пройди тест по Java
Проверь насколько хорошо ты знаешь Java и готов освоить 👩💻 Spring!
Ответишь — пройдешь на продвинутый курс "Разработчик на Spring Framework" от OTUS по специальной цене.
👉 ПРОЙТИ ТЕСТ: https://vk.cc/cBlvaEРеклама. ООО «Отус онлайн-образование», ОГРН 1177746618576, www.otus.ru
Используйте параметризованные тесты
Использование тестов с параметрами позволяет значительно увеличить качество и процент покрытия тестов без разрастания объема кода. Для того чтобы протестировать метод с различными параметрами, теперь не нужно писать несколько разных тестов — достаточно написать один, и передать ему все необходимые параметры на вход.
👉@BookJava
Разница создания списка при помощи List.of() Arrays.asList()
Понимание различий между List.of() и Arrays.asList() важно для любого Java-разработчика. List.of() — это фабричный метод, впервые представленный в Java 9, который создает неизменяемый список, содержащий указанные элементы.
— Неизменяемость: список, созданный List.of(), имеет фиксированный размер и не поддерживает добавление или удаление элементов. При попытке добавить или удалить элемент будет выброшено UnsupportedOperationException.
— Null значения: List.of() не допускает null элементов. Если вы попытаетесь добавить null, появится исключение NullPointerException.
Пример использования:1 List<String› immutableList = List.of("apple", "banana", "orange");
Для создания изменяемого списка следует использовать Arrays.asList()1 List<String> mutableList = Arrays.asList("red", "green", "blue");
В отличие от List.of(), Arrays.asList() допускает нулевые элементы.
👉@BookJava
Делайте все переменные final
По умолчанию делайте все локальные переменные final
. Исключение — если по логике эта переменная должна изменяться в последующем коде. Однако, переменных, которые мы инициализируем один раз и далее не изменяем, как правило, большинство.
То же правило можно отнести и к атрибутам класса — по умолчанию их также лучше делать final
, если мы хотим сделать состояние класса неизменяемым и потокобезопасным.
Разумеется, если по логике предполагается изменение состояния класса, изменяемые атрибуты не должны быть финальными.
👉@BookJava
Подборка Telegram каналов для программистов
Системное администрирование 📌
/channel/devops_star DevOps Star (Звезда Девопса)
/channel/i_linux Системный администратор
/channel/linuxchmod Linux
/channel/sys_adminos Системный Администратор
/channel/tipsysdmin Типичный Сисадмин (фото железа, было/стало)
/channel/sysadminof Книги для админов, полезные материалы
/channel/i_odmin Все для системного администратора
/channel/i_odmin_book Библиотека Системного Администратора
/channel/i_odmin_chat Чат системных администраторов
/channel/i_DevOps DevOps: Пишем о Docker, Kubernetes и др.
/channel/sysadminoff Новости Линукс Linux
1C разработка 📌
/channel/odin1C_rus Cтатьи, курсы, советы, шаблоны кода 1С
Программирование C++📌
/channel/cpp_lib Библиотека C/C++ разработчика
/channel/cpp_knigi Книги для программистов C/C++
/channel/cpp_geek Учим C/C++ на примерах
Программирование Python 📌
/channel/pythonofff Python академия. Учи Python быстро и легко🐍
/channel/BookPython Библиотека Python разработчика
/channel/python_real Python подборки на русском и английском
/channel/python_360 Книги по Python Rus
Java разработка 📌
/channel/BookJava Библиотека Java разработчика
/channel/java_360 Книги по Java Rus
/channel/java_geek Учим Java на примерах
GitHub Сообщество 📌
/channel/Githublib Интересное из GitHub
Базы данных (Data Base) 📌
/channel/database_info Все про базы данных
Мобильная разработка: iOS, Android 📌
/channel/developer_mobila Мобильная разработка
/channel/kotlin_lib Подборки полезного материала по Kotlin
Фронтенд разработка 📌
/channel/frontend_1 Подборки для frontend разработчиков
/channel/frontend_sovet Frontend советы, примеры и практика!
/channel/React_lib Подборки по React js и все что с ним связано
Разработка игр 📌
/channel/game_devv Все о разработке игр
Библиотеки 📌
/channel/book_for_dev Книги для программистов Rus
/channel/programmist_of Книги по программированию
/channel/proglb Библиотека программиста
/channel/bfbook Книги для программистов
/channel/books_reserv Книги для программистов
БигДата, машинное обучение 📌
/channel/bigdata_1 Data Science, Big Data, Machine Learning, Deep Learning
Программирование 📌
/channel/bookflow Лекции, видеоуроки, доклады с IT конференций
/channel/coddy_academy Полезные советы по программированию
/channel/rust_lib Полезный контент по программированию на Rust
/channel/golang_lib Библиотека Go (Golang) разработчика
/channel/itmozg Программисты, дизайнеры, новости из мира IT
/channel/php_lib Библиотека PHP программиста 👨🏼💻👩💻
/channel/nodejs_lib Подборки по Node js и все что с ним связано
/channel/ruby_lib Библиотека Ruby программиста
QA, тестирование 📌
/channel/testlab_qa Библиотека тестировщика
Шутки программистов 📌
/channel/itumor Шутки программистов
Защита, взлом, безопасность 📌
/channel/thehaking Канал о кибербезопасности
/channel/xakep_1 Статьи из "Хакера"
Книги, статьи для дизайнеров 📌
/channel/ux_web Статьи, книги для дизайнеров
Английский 📌
/channel/UchuEnglish Английский с нуля
Математика 📌
/channel/Pomatematike Канал по математике
/channel/phis_mat Обучающие видео, книги по Физике и Математике
Excel лайфхак📌
/channel/Excel_lifehack
/channel/tikon_1 Новости высоких технологий, науки и техники💡
/channel/mir_teh Мир технологий (Technology World)
Вакансии 📌
/channel/sysadmin_rabota Системный Администратор
/channel/progjob Вакансии в IT
👩💻 Обучение для тех, кто хочет освоить Java на профессиональном уровне — актуальный стек, 88 часов практической работы, детальный разбор технологий изнутри
Пройди тест по Java и проверь свои знания, готов ли ты к обучению на курсе.
Ответишь — пройдешь на продвинутый курс "Java Developer. Professional" от OTUS по специальной цене.
👉 ПРОЙТИ ТЕСТ: https://vk.cc/cAZ9dUРеклама. ООО «Отус онлайн-образование», ОГРН 1177746618576
МТС True Tech Champ
Масштабное ИТ-событие для опытных и начинающих разработчиков. Можно принять участие в одном из двух треков чемпионата или присоединиться к шоу-финалу в качестве гостя.
Что ждёт участников чемпионата:
— алгоритмические задачи и программирование роботов;
— два отборочных онлайн-этапа и финал с гонкой роботов в офлайне;
— призовой фонд 10 250 000 ₽.
Что ждёт гостей:
— конференция с участием ИТ-экспертов;
— кодерские и развлекательные айтивности;
— шоу-финал чемпионата по программированию.
А ещё все желающие смогут почувствовать себя на месте финалистов чемпионата: попробовать провести по лабиринту робота-мышь!
Узнай детали, выбери формат и зарегистрируйся по ссылке.
🎬 Amplicode – конвейер для Spring-приложений прямо в IntelliJ IDEA
На прошлой неделе мы провели митап, который длился 3,5 часа!
Мы понимаем, что усвоить столько информации за раз непросто (если только ты не Илья Кучмин :D). Поэтому мы выложили запись в высоком качестве и разбили её на плейлист с полной записью мероприятия и отдельными его частями.
Всего получилось 6 докладов:
– История и философия Amplicode (Илья Кучмин)
– Локальное окружение с Docker Compose для Spring Boot (Кирилл Толкачёв)
– Проблемы JPA в Spring PetClinic и способы их решения (Илья и Фёдор Сазоновы)
– Разрабатываем правильный REST API для Spring Boot (Рустам Курамшин)
– Настраиваем Spring Security и Keycloak (Павел Кислов)
– Admin UI с использованием React Admin для Spring Boot (Александр Шустанов)
✔️СМОТРЕТЬ НА YOUTUBE
✔️СМОТРЕТЬ В VK ВИДЕО
✔️СМОТРЕТЬ НА RUTUBE
🤝 Не дай себя завязнуть в рутинных задачах!
🦾 Осваивай Spring и выходи на новый профессиональный уровень
Пройди тест по Java от OTUS
Проверь насколько хорошо ты знаешь Java и готов освоить Spring!
Ответишь — пройдешь на продвинутый курс "Разработчик на Spring Framework" от OTUS по специальной цене.
👉 ПРОЙТИ ТЕСТ: https://vk.cc/cAVOtm
🎫 Начни обучение со скидкой, подробности у менеджеров.Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576, www.otus.ru