Метод incrementAndGet
Метод incrementAndGet класса AtomicInteger
атомарно увеличивает текущее значение переменной на
единицу и возвращает уже новое, увеличенное значение.
Метод не принимает параметров. Операция выполняется
как единое неделимое действие, поэтому её безопасно
использовать из нескольких потоков одновременно без
внешней синхронизации.
Метод возвращает значение типа int - то, которое
получилось после увеличения.
Синтаксис
atomicInteger.incrementAndGet()
Пример
Давайте создадим счётчик и увеличим его значение на единицу, выведя результат:
import java.util.concurrent.atomic.AtomicInteger;
public class Main
{
public static void main(String[] args)
{
AtomicInteger counter = new AtomicInteger(0);
int res = counter.incrementAndGet();
System.out.println(res);
}
}
Результат выполнения кода:
1
Пример
Давайте увеличим значение три раза подряд и посмотрим, что вернёт каждый вызов:
import java.util.concurrent.atomic.AtomicInteger;
public class Main
{
public static void main(String[] args)
{
AtomicInteger counter = new AtomicInteger(0);
System.out.println(counter.incrementAndGet());
System.out.println(counter.incrementAndGet());
System.out.println(counter.incrementAndGet());
}
}
Результат выполнения кода:
1
2
3
Пример
Давайте посмотрим, как incrementAndGet работает
при одновременном доступе из нескольких потоков.
Запустим два потока, каждый из которых увеличит
счётчик по тысяче раз:
import java.util.concurrent.atomic.AtomicInteger;
public class Main
{
public static void main(String[] args) throws InterruptedException
{
AtomicInteger counter = new AtomicInteger(0);
Runnable task = () -> {
for (int i = 0; i < 1000; i++) {
counter.incrementAndGet();
}
};
Thread t1 = new Thread(task);
Thread t2 = new Thread(task);
t1.start();
t2.start();
t1.join();
t2.join();
System.out.println(counter.get());
}
}
Результат выполнения кода:
2000
Благодаря атомарности метода значение всегда
будет равно 2000 - операции двух потоков
не перезаписывают друг друга.
Смотрите также
-
класс
AtomicInteger,
который хранит атомарное целое число -
метод
get,
который возвращает текущее значение -
метод
set,
который устанавливает новое значение -
метод
compareAndSet,
который меняет значение при совпадении