Атомарные классы в 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);