Java for Beginner
675 subscribers
558 photos
156 videos
12 files
851 links
Канал от новичков для новичков!
Изучайте Java вместе с нами!
Здесь мы обмениваемся опытом и постоянно изучаем что-то новое!

Наш YouTube канал - https://www.youtube.com/@Java_Beginner-Dev

Наш канал на RUTube - https://rutube.ru/channel/37896292/
Download Telegram
Аннотации для работы с синхронизацией

Аннотация @Synchronized — управление синхронизацией

Аннотация @Synchronized позволяет создавать синхронизированные методы, аналогично использованию ключевого слова synchronized в Java. Однако @Synchronized предоставляет больше гибкости, так как позволяет синхронизировать методы на разных объектах.

Пример использования:
import lombok.Synchronized;

public class Counter {
private int count = 0;

@Synchronized
public void increment() {
count++;
}

@Synchronized("lock")
public void decrement() {
count--;
}

private final Object lock = new Object();
}


Как это работает под капотом?

Lombok генерирует код, который использует блоки synchronized для обеспечения потокобезопасности. Вот что происходит:

Генерация байт-кода:
Если аннотация @Synchronized используется без параметров, Lombok создает скрытое поле $lock и синхронизирует метод на этом поле.
Если указан параметр (например,
@Synchronized("lock")), Lombok синхронизирует метод на указанном объекте.

Пример сгенерированного кода:
public class Counter {
private int count = 0;
private final Object $lock = new Object(); // Скрытое поле для синхронизации
private final Object lock = new Object();

public void increment() {
synchronized ($lock) {
count++;
}
}

public void decrement() {
synchronized (lock) {
count--;
}
}
}


Создание скрытых полей:
Если объект для синхронизации не указан, Lombok создает скрытое поле $lock типа Object. Это поле используется для синхронизации всех методов, помеченных @Synchronized без параметров.

Нюансы использования

Производительность:
Использование @Synchronized может привести к снижению производительности, так как синхронизация блокирует выполнение кода в других потоках. Это особенно важно в высоконагруженных приложениях.

Взаимодействие с другими аннотациями:
@Synchronized можно комбинировать с другими аннотациями Lombok, такими как @Getter, @Setter, @Data. Однако будьте осторожны при использовании с аннотациями, которые генерируют методы (например, @Builder), так как это может привести к неожиданному поведению.

Ограничение на объекты синхронизации:
Объект, указанный в @Synchronized("lock"), должен быть финальным (final), чтобы избежать изменений во время выполнения. В противном случае синхронизация может работать некорректно.

Проблемы с наследованием:
Если метод, помеченный @Synchronized, переопределяется в подклассе, синхронизация может не работать, так как Lombok генерирует код только для текущего класса.

Альтернативы
Вместо
@Synchronized можно использовать более современные механизмы синхронизации, такие как ReentrantLock или StampedLock, которые предоставляют больше гибкости и контроля.

#Java #Training #Spring #Lombok #Synchronized