Telegram Web
Примитивные типы данных

Мини-шпаргалка для новичков и тех, кто повторяет основы

🔸byte — 1 байт
Диапазон: -128 до 127

🔸short — 2 байта
Диапазон: -32,768 до 32,767

🔸int — 4 байта
Диапазон: -2,147,483,648 до 2,147,483,647

🔸long — 8 байт
Диапазон: ±9 квинтиллионов (±2^63)

🔸float — 4 байта
Точность: ~7 знаков после запятой

🔸double — 8 байт
Точность: ~15 знаков после запятой

🔸char — 2 байта
Хранит 1 Unicode-символ

🔸 boolean — ~1 бит (зависит от JVM)
Значения: true / false

👉 Java Portal
Please open Telegram to view this post
VIEW IN TELEGRAM
Взаимоблокировка (deadlock) в Java

Взаимоблокировка возникает, когда два потока удерживают блокировки и одновременно ожидают освобождения друг друга, что приводит к зависанию программы. Такая ситуация труднообнаружима и становится кошмаром в масштабных приложениях 😨

👉 Java Portal
Please open Telegram to view this post
VIEW IN TELEGRAM
Java остаётся одним из самых популярных языков уже больше двух десятилетий.

Банковские системы, e-commerce платформы, Android-приложения и многое другое, всё это можно писать на Java.

В этом курсе ты изучишь основы Java: от переменных и циклов до объектно-ориентированного программирования (OOP). 😊

👉 Java Portal
Please open Telegram to view this post
VIEW IN TELEGRAM
Продвинутый уровень конкуррентности, неблокирующие структуры данных

Если вы пишете многопоточные приложения с высокой нагрузкой, стоит обратить внимание на lock-free программирование. Использование атомарных переменных позволяет обходиться без блокировок, это помогает избежать блокировок и повысить производительность при параллельном доступе к данным

👉 Java Portal
Please open Telegram to view this post
VIEW IN TELEGRAM
Масштабирование Java-приложений

Масштабируемость — это способность Java-приложения справляться с увеличением нагрузки (больше пользователей, данных или операций) без потери производительности и надежности. Экосистема Java с её мощными фреймворками и библиотеками предоставляет инструменты для построения масштабируемых систем.

Ключевые стратегии масштабирования Java-приложений

1) Модульная архитектура и микросервисы

Разделяйте монолит: разбивайте приложение на небольшие независимые модули или микросервисы. Каждый сервис можно разрабатывать, деплоить и масштабировать независимо.

🔹Преимущества: масштабируемость отдельных компонентов, изоляция отказов, ускорение разработки.

2) Горизонтальное и вертикальное масштабирование

🔹Горизонтальное масштабирование — добавление серверов/инстансов для распределения нагрузки (например, AWS ELB или Nginx).
🔹Вертикальное масштабирование — увеличение ресурсов на одном сервере (CPU, RAM).

Пример: Развертывание нескольких stateless-сервисов на Spring Boot за балансировщиком, хранение сессий в Redis.

3) Оптимизация базы данных

🔹Пул подключений — используйте HikariCP для эффективного управления соединениями.
🔹Кэширование — внедряйте Redis или Ehcache для сокращения повторяющихся запросов.
🔹Шардирование и репликация — делите данные между БД или используйте реплики для высокой доступности.

Пример на 2 фото

4) Асинхронная и событийно-ориентированная обработка

🔹ExecutorService — управление фоновыми задачами через пулы потоков.
🔹Очереди сообщений — Kafka или RabbitMQ для декуплинга логики и повышения пропускной способности.
🔹Реактивное программирование — Project Reactor или RxJava для неблокирующих, событийных приложений.

Пример на 3 фото

5) Балансировка нагрузки

🔹Распределение запросов — с помощью балансировщиков предотвращайте перегрузку одного инстанса.

Пример: Nginx или AWS ELB для маршрутизации API-запросов к нескольким backend-инстансам Java.

6) Надежность и устойчивость

🔹Отказоустойчивость и избыточность — проектируйте систему с учетом отказов, применяйте авто-масштабирование и резервные ресурсы.
🔹Мониторинг и алерты — используйте Prometheus, ELK Stack и др. для отслеживания метрик и раннего выявления проблем.

Чеклист лучших практик

> Проектируйте stateless-сервисы для простоты горизонтального масштабирования.
> Используйте API для взаимодействия между модулями/сервисами.
> Регулярно мониторьте и анализируйте производительность.
> Реализуйте безопасность на каждом уровне: авторизация, шифрование, сканирование уязвимостей.
> Проектируйте с учетом роста и изменений.

👉 Java Portal
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
Универсальная обёртка для API-ответов

Дженерики позволяют возвращать типобезопасные и переиспользуемые форматы ответов. Вот как создать обобщённую обёртку ApiResponse<T> для любого payload-а API.

👉 Java Portal
Please open Telegram to view this post
VIEW IN TELEGRAM
Разница между ассоциацией, агрегацией и композицией в Java

Определение

↳ Ассоциация: Общее отношение между двумя объектами

↳ Агрегация: Отношение «имеет», при котором дочерний объект может существовать независимо

↳ Композиция: Отношение «часть», при котором дочерний объект не может существовать без родительского

Тип

↳ Ассоциация: Слабо связанное отношение

↳ Агрегация: Ослабленная форма ассоциации (частный случай ассоциации)

↳ Композиция: Усиленная форма ассоциации

Зависимость

↳ Ассоциация: Объекты независимы

↳ Агрегация: Дочерний объект может пережить родительский

↳ Композиция: Жизненный цикл дочернего объекта зависит от родительского

Владение

↳ Ассоциация: Отсутствует владение

↳ Агрегация: Разделённое владение

↳ Композиция: Исключительное владение

Жизненный цикл

↳ Ассоциация: У обоих объектов собственный жизненный цикл

↳ Агрегация: Родитель и потомок могут иметь разные жизненные циклы

↳ Композиция: Жизненный цикл дочернего объекта строго привязан к родительскому

Пример из реальной жизни

↳ Ассоциация: Студент <—> Университет (могут существовать независимо)

↳ Агрегация: Кафедра <—> Университет (могут существовать раздельно)

↳ Композиция: Сердце <—> Человек (не может существовать без человека)

Пример в Java

↳ Ассоциация: Класс A содержит ссылку на класс B

↳ Агрегация: Класс School содержит список объектов Student

↳ Композиция: Класс House содержит объекты Room (при удалении House удаляются и Room)

👉 Java Portal
Please open Telegram to view this post
VIEW IN TELEGRAM
Пример выше демонстрирует, как с помощью дженериков можно создать типобезопасный и переиспользуемый процессор данных, который работает с коллекциями объектов, в данном случае, с сотрудниками (Employee).

Основные моменты:

> DataProcessor<T> — обобщённый класс, хранящий список элементов типа T и предоставляющий метод getMax(...), который возвращает максимум по заданному компаратору.
> Employee реализует Comparable<Employee> и переопределяет метод compareTo, чтобы сравнивать сотрудников по зарплате.
> В main() создаются объекты сотрудников и добавляются в DataProcessor<Employee>, после чего находится сотрудник с максимальной зарплатой.

Вывод программы:

Highest paid: Bob ($75000.0)


👉 Java Portal
Please open Telegram to view this post
VIEW IN TELEGRAM
Защита вашего приложения с помощью Spring Security и OAuth2 Login.

Публичный доступ разрешён к / и /login, все остальные эндпоинты требуют аутентификации.

Полное руководство читайте здесь: тык

👉 Java Portal
Please open Telegram to view this post
VIEW IN TELEGRAM
image_2025-06-22_08-35-57.png
2.3 MB
ReadWriteLock в Java

ReadWriteLock — это утилита для работы с параллелизмом в Java, которая позволяет нескольким потокам одновременно читать ресурс, но только одному потоку — записывать, и только в том случае, если никакие другие потоки в данный момент не читают и не пишут.

Этот механизм значительно повышает пропускную способность в приложениях с преобладанием операций чтения по сравнению с использованием обычного взаимного исключения (например, synchronized или ReentrantLock), где доступ к ресурсу может получить только один поток за раз.
Как работает ReadWriteLock

🔹Read Lock (блокировка на чтение):
Несколько потоков могут одновременно получить блокировку на чтение, если ни один поток не владеет блокировкой на запись и ни один поток не ожидает записи. Это позволяет выполнять параллельные операции чтения, что эффективно для ресурсов, к которым часто обращаются на чтение и редко — на запись.

🔹Write Lock (блокировка на запись):
Только один поток может получить блокировку на запись, и только если в данный момент нет активных читателей и писателей. Это обеспечивает исключительный доступ при модификации данных, предотвращая неконсистентность.

Java предоставляет стандартную реализацию интерфейса ReadWriteLock в виде класса ReentrantReadWriteLock.

Пример применения

Допустим, у вас есть общая структура данных, например, кэш или список, к которым обращаются несколько потоков:

🔹Читатели: множество потоков часто читают данные.
🔹Писатели: время от времени поток обновляет данные.

Используя ReadWriteLock, вы позволяете всем читателям одновременно обращаться к данным, но гарантируете, что при обновлении данных писатель будет иметь исключительный доступ. Это повышает производительность и обеспечивает потокобезопасность.

👉 Java Portal
Please open Telegram to view this post
VIEW IN TELEGRAM
Это шпаргалка по основным командам Linux, разбитая по категориям.

🔹Файлы и навигация
🔹Системная информация
🔹Сетевые команды
🔹Процессы
🔹Архивация и сжатие
🔹Права доступа
🔹Другие команды

👉 Java Portal
Please open Telegram to view this post
VIEW IN TELEGRAM
Параллельная хеш-таблица с мелкозернистой блокировкой:

Потокобезопасная хеш-таблица с блокировками на уровне бакетов для минимизации конфликтов — подходит для высокопроизводительных систем, таких как базы данных или кеши.

👉 Java Portal
Please open Telegram to view this post
VIEW IN TELEGRAM
Java Enums — Всё, что нужно знать

1. enum Status { PENDING, APPROVED, REJECTED } → Базовый Enum

• Это называется enum (сокращение от enumeration).
• Используется для задания фиксированного набора констант (например, состояния заказа, роли пользователя).

2. Status.valueOf("APPROVED") → Преобразование строки в Enum

• Бросает исключение, если строка некорректна.
• Используется при маппинге из БД, пользовательского ввода или JSON (например, парсинг статуса из запроса).

3. Status.APPROVED.name() → Получить имя как строку

• Возвращает имя enum-константы в точности как оно определено.
• Используется при логировании, сериализации и т. д. (например, отображение enum как строки в ответе).

4. Status.APPROVED.ordinal() → Получить индекс Enum

• Возвращает позицию (начиная с 0).
• Используется только если порядок важен (обычно избегается ради стабильности) — например, для ранжирования уровней.

5. for (Status s : Status.values()) → Перебор значений Enum

• Используется для итерации по всем константам.
• Удобно для UI-дропдаунов, фильтров, пакетной обработки.

6. enum Day { MON, TUE; boolean isWeekend() { return false; } } → Enum с методами

• Добавляет поведение к enum.
• Используется, если для каждой константы нужна логика (например, isHoliday() для Day).

7. enum Type { BASIC("B"), PREMIUM("P"); private String code; ... } → Enum с полями

• Используется для хранения дополнительных данных с каждой константой (например, код из БД, описание).

8. Enum с абстрактным методом

enum Mode {
ON { void act() { /* что-то делаем */ } },
OFF { void act() { /* ничего не делаем */ } };
abstract void act();
}


• Называется поведенческим enum'ом.
• Используется для логики, подобной конечному автомату (например, стратегии на константу).

9. EnumSet.of(Status.APPROVED) → EnumSet

• Высокопроизводительное множество для enum.
• Используйте вместо HashSet<Enum> (например, для фильтрации флагов или ролей).

10. EnumMap<Status, String> → EnumMap

• Эффективная key-value структура, использующая enum в качестве ключа.
• Быстрее и легче, чем HashMap<Enum, X> (например, для меток или конфигураций по статусу).

11. switch(status) → Enum в операторе switch

• Работает с enum'ами нативно.
• Используется для route-логики (например, обработки каждого статуса по-своему).

👉 Java Portal
Please open Telegram to view this post
VIEW IN TELEGRAM
Что такое daemon-поток в Java?

Daemon-поток — это фоновый поток, который работает для поддержки пользовательских потоков. Примеры — сборщик мусора или системы мониторинга. Главное отличие: daemon-потоки не мешают завершению работы JVM. Как только все пользовательские (не-daemon) потоки завершатся, JVM завершится автоматически, даже если daemon-потоки ещё работают.

Как создаете daemon-поток?


🔹 Создаёте поток как обычно
🔹 Вызываете setDaemon(true) до запуска потока
🔹 Запускаете поток через start()

Как только основной (пользовательский) поток завершится — JVM выключится, даже если daemon-поток всё ещё активен.

Используйте daemon-потоки для фоновых сервисов, которые не должны блокировать завершение приложения. Всегда вызывайте setDaemon(true) до запуска

👉 Java Portal
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
Разные способы защиты API-эндпоинтов

→ API-ключи
Клиент отправляет ключ в заголовках или query-параметрах

👍 Просто реализуется
👎 Нет идентификации пользователя, легко утечь

→ OAuth2 (токены доступа)
Механизм авторизации через токены с областью доступа и сроком действия

👍 Тонкая настройка прав доступа, широко поддерживается
👎 Более сложная настройка

→ JWT (JSON Web Tokens)
Самодостаточный токен с наборами claims

👍 Без состояния (stateless), хорошо масштабируется
👎 Сложно отзывать, больше размер

→ Basic Auth
Отправка Base64(username:password) в заголовке

👍 Удобно для быстрого тестирования
👎 Никогда не используйте в продакшене

→ mTLS (взаимная TLS-аутентификация)
И клиент, и сервер проверяют сертификаты друг друга

👍 Высокий уровень доверия и шифрования
👎 Сложная инфраструктура и управление сертификатами

Для внутренних сервисов → mTLS + токены с коротким сроком жизни

Для публичных API → OAuth2 + scopes (области доступа)

Для тестирования/разработки → API-ключи или Basic Auth

👉 Java Portal
Please open Telegram to view this post
VIEW IN TELEGRAM
Ограничение частоты запросов в Spring Boot с помощью Bucket4j

Реализация rate limiting в REST API на Spring Boot с использованием Bucket4j для контроля частоты запросов на пользователя, что повышает масштабируемость API. Подходит для предотвращения злоупотреблений в продакшн-системах

• Импортируются классы из Bucket4j, Spring и Java SDK.
• Создаётся REST-контроллер с маппингом /api
• Для каждого пользователя создаётся бакет с лимитом 5 запросов в минуту. Если бакет позволяет — запрос проходит. Если нет — возвращается 429 статус.
• Заглушка для HttpServletResponse, нужна чтобы код можно было запускать без настоящего HTTP-сервера.

👉 Java Portal
Please open Telegram to view this post
VIEW IN TELEGRAM
2025/06/27 13:16:31
Back to Top
HTML Embed Code: