Библиотека джависта | Java, Spring, Maven, Hibernate
23.8K subscribers
2.06K photos
41 videos
43 files
2.9K links
Все самое полезное для Java-разработчика в одном канале.

Список наших каналов: https://t.iss.one/proglibrary/9197

Для обратной связи: @proglibrary_feeedback_bot

По рекламе: @proglib_adv

РКН: https://gosuslugi.ru/snet/67a5bbda1b17b35b6c1a55c4
Download Telegram
👑 Магия IntelliJ IDEA: Postfix Completion

Хотите писать код быстрее и без лишнего копипаста? Используйте Postfix Completion — умные сокращения, которые превращают выражения в полноценный код.

🔹 Что делает

— Превращает набранное выражение в готовую конструкцию (например, myVar.notnull → if (myVar != null) {...})
— Работает для условий, циклов, логирования, null-check и многого другого
— Доступна для Java, Kotlin и многих языков

🔹 Зачем это нужно

— Экономит время
— Снижает вероятность синтаксических ошибок
— Ускоряет рутинные действия (особенно null-checks)

🔹 Как использовать

— Пишите выражение, затем ставите точку и выбираете суффикс (например, .if, .for, .notnull)
— IDEA сама развернёт шаблон в готовый код
— Список доступных суффиксов: Settings → Editor → General → Postfix Completion

🐸 Библиотека джависта

#Enterprise
Please open Telegram to view this post
VIEW IN TELEGRAM
👍82🔥1
💎 Как работает volatile под капотом

Многие знают, что volatile «гарантирует видимость между потоками». Давайте разберёмся, что именно делает это ключевое слово на уровне Java Memory Model (JMM).

1️⃣ Проблема без volatile

В многопроцессорной архитектуре потоки могут обращаться к своим копиям переменных через L1/L2 кэши, а не к основной памяти. Компилятор и процессор активно реорганизуют инструкции (out-of-order, speculative execution), что при отсутствии механизмов синхронизации ведёт к неожиданному поведению в многопоточности.

Если переменная не volatile, один поток может работать со старым значением из кеша и никогда не увидеть обновление другим потоком.

Пример:
class FlagExample {
boolean flag = false;

void thread1() {
while (!flag) {
// бесконечный цикл
}
}

void thread2() {
flag = true;
}
}


JVM и JIT могут оптимизировать while(!flag) так, что значение flag будет читаться один раз и кешироваться локально — и первый поток не выйдет из цикла.

2️⃣ Что делает volatile

🔹 Гарантирует видимость — каждое чтение/запись идёт из основной памяти, а не из локальных кешей

🔹 Гарантирует порядок операций — volatile запрещает компилятору и процессору менять порядок операций до и после чтения/записи

🔹 Гарантирует правило happens-before — запись в переменную будет видна всем потокам, которые читают её после

3️⃣ Что volatile не может

Пример:
volatile int counter = 0;

void inc() {
if (counter < 10) {
counter++; // всё ещё не безопасно
}
}


▪️ Не обеспечивает атомарность

counter++ разваливается на чтение → инкремент → запись. Если два потока сделают это одновременно, одно из увеличений потеряется.
Для атомарных операций используйте атомики или синхронизацию.

▪️ Не заменяет synchronized

volatile гарантирует видимость, но не защищает этот блок от одновременного выполнения разными потоками. Для таких случаев используйте synchronized или Lock.

4️⃣ Где volatile идеально подходит

✔️ Флаги завершения потоков
✔️ Double-checked locking (ленивая инициализация)
✔️ Публикация объекта для многопоточного чтения

Пример double-checked locking:
class Singleton {
private static volatile Singleton instance;

public static Singleton getInstance() {
if (instance == null) {
synchronized (Singleton.class) {
if (instance == null) {
instance = new Singleton();
}
}
}
return instance;
}
}


Без volatile JVM могла бы отдать ссылку на не до конца сконструированный объект.

🔗 Документация: Java Memory Model | Volatile

💬 В каких кейсах используете volatile в продакшене?

🐸 Библиотека джависта

#CoreJava
Please open Telegram to view this post
VIEW IN TELEGRAM
👍11🔥3👏2
💬 А у вас есть тестировщик в команде?

🐸 Библиотека джависта

#DevLife
Please open Telegram to view this post
VIEW IN TELEGRAM
😁10👍3🔥1
🆕 JEP 522 — Повышение производительности G1 GC через снижение синхронизации

🔵 Статус и контекст

— JEP 522, авторы — Ivan Walulya и Thomas Schatzl, нацелен на реализацию в JDK 26; последнее обновление датировано 8 сентября 2025 года.
— Согласно дорожной карте JDK 26, окончательное рассмотрение этого JEP запланировано на 15 сентября 2025 года.

🔵 Что меняется

— Предложено снизить накладные расходы на синхронизацию между потоками приложения и сборщика мусора G1, сохранив существующую архитектуру и взаимодействие с пользователем.

— Ключевая идея — внедрение второй таблицы карточек (card table):

▪️ Потоки приложения работают с быстрой, простой, синхронно-нережимой "первой" таблицей
▪️ Потоки-оптимизаторы обрабатывают отдельную вторую таблицу
▪️ При необходимости G1 выполняет атомарный обмен таблицами, позволяя каждому потоку работать автономно и эффективно

🔵 Преимущества

— Производительность:

▪️ В сценариях с частыми изменениями ссылок в объектах — прирост производительности в диапазоне 5–15 %
▪️ Даже в менее интенсивных сценариях — прирост до 5 % за счёт упрощения write-барьеров (уменьшение с ~50 до ~12 инструкций на x64)

— Снижение пауз GC: более лёгкая структура таблиц карточек и менее громоздкая синхронизация сокращают продолжительность пауз сборщика мусора

— Дополнительная память:

▪️ Вторая таблица занимает ~0,2 % от кучи — порядка 2 МБ на каждый ГБ JVM-кучи
▪️ Несмотря на это, она заменяет более объёмные вспомогательные структуры и не увеличивает общий объём памяти заметно

🐸 Библиотека джависта

#News
Please open Telegram to view this post
VIEW IN TELEGRAM
👍5🔥41💯1
💬 Во сколько начинается ваш рабочий день?

🐸 Библиотека джависта

#DevLife
Please open Telegram to view this post
VIEW IN TELEGRAM
😁7👍2🔥1
🎯 Как настроить аутентификацию с OAuth2

В Spring Boot 3 интеграция с OAuth2 стала ещё проще благодаря улучшенной поддержке социальных логинов. Рассмотрим, как настроить аутентификацию через Google с использованием Spring Security 6.

1️⃣ Создание проекта

Используйте Spring Initializr для создания проекта с следующими зависимостями:

— Spring Web
— Spring Security
— OAuth2 Client

Или добавьте их вручную в pom.xml:
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-oauth2-client</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
</dependencies>


2️⃣ Получение OAuth2-учётных данных Google

1. Перейдите в Google Cloud Console
2. Создайте новый проект
3. Перейдите в раздел APIs & Services → Credentials
4. Нажмите Create Credentials → OAuth 2.0 Client IDs
5. Укажите тип приложения Web application
6. Добавьте Authorized redirect URI
7. Сохраните и получите Client ID и Client Secret

3️⃣ Конфигурация application.yml

Добавьте следующие настройки в src/main/resources/application.yml:
spring:
security:
oauth2:
client:
registration:
google:
client-id: YOUR_CLIENT_ID
client-secret: YOUR_CLIENT_SECRET
scope:
- email
- profile
redirect-uri: "{baseUrl}/login/oauth2/code/{registrationId}"
authorization-grant-type: authorization_code
client-name: Google
provider:
google:
authorization-uri: https://accounts.google.com/o/oauth2/v2/auth
token-uri: https://oauth2.googleapis.com/token
user-info-uri: https://www.googleapis.com/oauth2/v3/userinfo
user-name-attribute: sub


Замените YOUR_CLIENT_ID и YOUR_CLIENT_SECRET на полученные значения.

4️⃣ Конфигурация безопасности

Создайте класс конфигурации:
@Configuration
public class SecurityConfig {

@Bean
public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
http
.authorizeRequests()
.antMatchers("/", "/login", "/error").permitAll()
.anyRequest().authenticated()
.and()
.oauth2Login()
.loginPage("/login")
.defaultSuccessUrl("/dashboard", true);
return http.build();
}
}

🐸 Библиотека джависта

#Enterprise
Please open Telegram to view this post
VIEW IN TELEGRAM
3👍2🔥2