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

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

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

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

РКН: https://gosuslugi.ru/snet/67a5bbda1b17b35b6c1a55c4
Download Telegram
💎 Как работает 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
👍14🔥3👏2
⚙️ Интеграция системы логирования с Logback в Spring Boot

Ищете, как настроить логирование в приложении на Spring Boot? Используйте Logback для эффективного логирования и управления уровнями логов. Используйте AI для ускорения процесса.

📝 Промпт:


Generate a logging system integration for a Spring Boot 3 application using Logback.

— Set up logback-spring.xml for flexible configuration of logging levels and appenders.
— Define rolling file appender to archive old log files based on size or date.
— Configure log format with PatternLayoutEncoder for structured and readable logs.
— Implement different logging levels (INFO, WARN, ERROR) for different components of the application.
— Integrate MDC (Mapped Diagnostic Context) for tracking user sessions or specific requests.
— Set up asynchronous logging with AsyncAppender to improve performance in high-traffic applications.
— Enable console logging for development and file logging for production environments.


💡 Расширения:

— Добавьте Set up rolling file appender for log rotation based on size or date для архивирования старых логов.
— Добавьте Implement asynchronous logging with AsyncAppender для улучшения производительности в высоконагруженных приложениях.
— Добавьте Integrate custom appenders for external monitoring systems like Elasticsearch or Splunk для интеграции с внешними системами мониторинга.

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

#CoreJava
Please open Telegram to view this post
VIEW IN TELEGRAM
👍72🔥1