Найти тему
JavAKnazzz

Атомарные классы в Java

Атомарные классы в Java - это классы, которые обеспечивают атомарность операций чтения и записи для примитивных типов данных (int, long, double и т.д.). Они позволяют выполнять операции чтения и записи без блокировки всего объекта, что улучшает производительность в многопоточных приложениях.

В Java существует несколько классов Atomic: AtomicBoolean, AtomicInteger, AtomicLong, AtomicReference и т.д. Все они имеют схожий интерфейс, который включает в себя методы для чтения и записи значения, а также методы для выполнения атомарных операций, таких как увеличение значения на 1 или сравнение и установка значения.

Пример использования класса AtomicInteger:

import java.util.concurrent.atomic.AtomicInteger;

public class AtomicExample {
public static void main(String[] args) {
AtomicInteger counter = new AtomicInteger(0);
int currentValue = counter.get();
System.out.println("Current value: " + currentValue);

int newValue = counter.incrementAndGet();
System.out.println("New value: " + newValue);
}
}

В этом примере мы создаем экземпляр класса AtomicInteger со значением 0. Затем мы получаем текущее значение с помощью метода get() и выводим его в консоль. Далее мы используем метод incrementAndGet(), который увеличивает значение на 1 и возвращает новое значение. Новое значение также выводится в консоль.

Операция увеличения значения на 1 в данном примере является атомарной, что означает, что ее выполнение не может быть прервано другим потоком. Таким образом, мы можем быть уверены в том, что результат выполнения операции будет корректным.

Классы Atomic также имеют методы для выполнения других атомарных операций, таких как сравнение и установка значения, уменьшение значения на 1, а также операции побитового сдвига и логических операций.

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

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

1. get() - возвращает текущее значение переменной


AtomicInteger counter = new AtomicInteger(0);
int currentValue = counter.get();



2. set(int newValue) - устанавливает новое значение переменной


AtomicInteger counter = new AtomicInteger(0);
counter.set(10);


3. incrementAndGet() - увеличивает значение переменной на 1 и возвращает новое значение


AtomicInteger counter = new AtomicInteger(0);
int newValue = counter.incrementAndGet();



4. compareAndSet(int expect, int update) - сравнивает текущее значение переменной с ожидаемым значением (expect) и если они равны, устанавливает новое значение (update)


AtomicInteger counter = new AtomicInteger(0);
boolean success = counter.compareAndSet(0, 10);
if (success) {
System.out.println("Value was updated successfully");
}



5. addAndGet(int delta) - увеличивает значение переменной на заданное число (delta) и возвращает новое значение


AtomicInteger counter = new AtomicInteger(0);
int newValue = counter.addAndGet(5);



6. getAndIncrement() - возвращает текущее значение переменной и увеличивает его на 1



AtomicInteger counter = new AtomicInteger(0);
int currentValue = counter.getAndIncrement();



7. decrementAndGet() - уменьшает значение переменной на 1 и возвращает новое значение


AtomicInteger counter = new AtomicInteger(5);
int newValue = counter.decrementAndGet();


8. getAndSet(int newValue) - возвращает текущее значение переменной и устанавливает новое значение


AtomicInteger counter = new AtomicInteger(0);
int currentValue = counter.getAndSet(10);