Параллелизм Java - класс AtomicLong
Класс java.util.concurrent.atomic.AtomicLong предоставляет операции с базовым длинным значением, которое может быть прочитано и записано атомарно, а также содержит расширенные атомарные операции. AtomicLong поддерживает атомарные операции с базовой переменной типа long. У него есть методы получения и установки, которые работают как чтение и запись для изменчивых переменных. То есть набор имеет отношение «происходит до» с любым последующим получением той же переменной. Атомарный метод compareAndSet также имеет эти функции согласованности памяти.
Методы AtomicLong
Ниже приводится список важных методов, доступных в классе AtomicLong.
Sr. No. | Метод и описание |
---|---|
1 | public long addAndGet(long delta) Атомно добавляет данное значение к текущему значению. |
2 | public boolean compareAndSet(long expect, long update) Атомарно устанавливает значение для данного обновленного значения, если текущее значение совпадает с ожидаемым значением. |
3 | public long decrementAndGet() Атомарно уменьшает текущее значение на единицу. |
4 | public double doubleValue() Возвращает значение указанного числа в виде двойного числа. |
5 | public float floatValue() Возвращает значение указанного числа в виде числа с плавающей запятой. |
6 | public long get() Получает текущее значение. |
7 | public long getAndAdd(long delta) Атомарно добавляет заданное значение к текущему значению. |
8 | public long getAndDecrement() Атомарно уменьшает текущее значение на единицу. |
9 | public long getAndIncrement() Атомарно увеличивает текущее значение на единицу. |
10 | public long getAndSet(long newValue) Атомно устанавливает данное значение и возвращает старое значение. |
11 | public long incrementAndGet() Атомарно увеличивает текущее значение на единицу. |
12 | public int intValue() Возвращает значение указанного числа как целое число. |
13 | public void lazySet(long newValue) В конце концов устанавливается на заданное значение. |
14 | public long longValue() Возвращает значение указанного числа в виде длинного числа. |
15 | public void set(long newValue) Устанавливается на заданное значение. |
16 | public String toString() Возвращает строковое представление текущего значения. |
17 | public boolean weakCompareAndSet(long expect, long update) Атомарно устанавливает значение для данного обновленного значения, если текущее значение совпадает с ожидаемым значением. |
пример
Следующая программа TestThread показывает безопасную реализацию счетчика с использованием AtomicLong в среде на основе потоков.
import java.util.concurrent.atomic.AtomicLong;
public class TestThread {
static class Counter {
private AtomicLong c = new AtomicLong(0);
public void increment() {
c.getAndIncrement();
}
public long value() {
return c.get();
}
}
public static void main(final String[] arguments) throws InterruptedException {
final Counter counter = new Counter();
//1000 threads
for(int i = 0; i < 1000 ; i++) {
new Thread(new Runnable() {
public void run() {
counter.increment();
}
}).start();
}
Thread.sleep(6000);
System.out.println("Final number (should be 1000): " + counter.value());
}
}
Это даст следующий результат.
Вывод
Final number (should be 1000): 1000