Параллелизм 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