Класс java.util.concurrent.atomic.AtomicLong обеспечивает операции с базовым длинным значением, которые могут быть прочитаны и записаны атомарно, а также содержит расширенные атомарные операции. AtomicLong поддерживает атомарные операции с базовой переменной long. У него есть методы get и set, которые работают как чтение и запись по переменным переменным. То есть набор имеет отношение «происходит до» с любым последующим получением той же переменной. У атомарного метода compareAndSet также есть эти особенности согласованности памяти.
Методы AtomicLong
Ниже приведен список важных методов, доступных в классе AtomicLong.
Sr.No. | Метод и описание |
---|---|
1 |
public long addAndGet (длинная дельта) Атомно добавляет данное значение к текущему значению. |
2 |
public boolean compareAndSet (долгое ожидание, долгое обновление) Атомно устанавливает значение для данного обновленного значения, если текущее значение совпадает с ожидаемым значением. |
3 |
общедоступный long декремент AndGet () Атомно уменьшает на единицу текущее значение. |
4 |
public double doubleValue () Возвращает значение указанного числа в виде двойного числа. |
5 |
публичный float floatValue () Возвращает значение указанного числа в виде числа с плавающей запятой. |
6 |
публичный длинный get () Получает текущее значение. |
7 |
public long getAndAdd (длинная дельта) Atomiclly добавляет данное значение к текущему значению. |
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 () Возвращает значение указанного числа в виде long. |
15 |
открытый набор void (long newValue) Устанавливается на заданное значение. |
16 |
public String toString () Возвращает строковое представление текущего значения. |
17 |
public boolean weakCompareAndSet (долгое ожидание, долгое обновление) Атомно устанавливает значение для данного обновленного значения, если текущее значение совпадает с ожидаемым значением. |
public long addAndGet (длинная дельта)
Атомно добавляет данное значение к текущему значению.
public boolean compareAndSet (долгое ожидание, долгое обновление)
Атомно устанавливает значение для данного обновленного значения, если текущее значение совпадает с ожидаемым значением.
общедоступный long декремент AndGet ()
Атомно уменьшает на единицу текущее значение.
public double doubleValue ()
Возвращает значение указанного числа в виде двойного числа.
публичный float floatValue ()
Возвращает значение указанного числа в виде числа с плавающей запятой.
публичный длинный get ()
Получает текущее значение.
public long getAndAdd (длинная дельта)
Atomiclly добавляет данное значение к текущему значению.
public long getAndDecrement ()
Атомно уменьшает на единицу текущее значение.
public long getAndIncrement ()
Атомно увеличивает на единицу текущее значение.
public long getAndSet (long newValue)
Атомно устанавливает заданное значение и возвращает старое значение.
public long incrementAndGet ()
Атомно увеличивает на единицу текущее значение.
public int intValue ()
Возвращает значение указанного числа в виде целого числа.
public void lazySet (long newValue)
В конце концов устанавливается на заданное значение.
public long longValue ()
Возвращает значение указанного числа в виде long.
открытый набор void (long newValue)
Устанавливается на заданное значение.
public String toString ()
Возвращает строковое представление текущего значения.
public boolean weakCompareAndSet (долгое ожидание, долгое обновление)
Атомно устанавливает значение для данного обновленного значения, если текущее значение совпадает с ожидаемым значением.
пример
Следующая программа 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()); } }
Это даст следующий результат.