Класс java.util.concurrent.atomic.AtomicLongArray предоставляет операции с базовым длинным массивом, которые могут быть прочитаны и записаны атомарно, а также содержит расширенные атомарные операции. AtomicLongArray поддерживает атомарные операции с базовой переменной длинного массива. У него есть методы get и set, которые работают как чтение и запись по переменным переменным. То есть набор имеет отношение «происходит до» с любым последующим получением той же переменной. У атомарного метода compareAndSet также есть эти особенности согласованности памяти.
Методы AtomicLongArray
Ниже приведен список важных методов, доступных в классе AtomicLongArray.
Sr.No. | Метод и описание |
---|---|
1 |
public long addAndGet (int i, long delta) Атомно добавляет данное значение к элементу по индексу i. |
2 |
public boolean compareAndSet (int i, long ожидают, long update) Атомно устанавливает элемент в позиции i на заданное обновленное значение, если текущее значение == ожидаемое значение. |
3 |
общедоступный long декремент AndGet (int i) Атомно уменьшает на единицу элемент с индексом i. |
4 |
публично долго добираться (int i) Получает текущее значение в позиции i. |
5 |
public long getAndAdd (int i, long delta) Атомно добавляет данное значение к элементу по индексу i. |
6 |
public long getAndDecrement (int i) Атомно уменьшает на единицу элемент с индексом i. |
7 |
public long getAndIncrement (int i) Атомно увеличивает на единицу элемент с индексом i. |
8 |
public long getAndSet (int i, long newValue) Атомно устанавливает элемент в позиции i на заданное значение и возвращает старое значение. |
9 |
public long incrementAndGet (int i) Атомно увеличивает на единицу элемент с индексом i. |
10 |
public void lazySet (int i, long newValue) В конце концов устанавливает элемент в позиции i на заданное значение. |
11 |
public int length () Возвращает длину массива. |
12 |
открытый набор void (int i, long newValue) Устанавливает элемент в позиции i в указанное значение. |
13 |
public String toString () Возвращает строковое представление текущих значений массива. |
14 |
public boolean weakCompareAndSet (int i, long ожидают, long update) Атомно устанавливает элемент в позиции i на заданное обновленное значение, если текущее значение == ожидаемое значение. |
public long addAndGet (int i, long delta)
Атомно добавляет данное значение к элементу по индексу i.
public boolean compareAndSet (int i, long ожидают, long update)
Атомно устанавливает элемент в позиции i на заданное обновленное значение, если текущее значение == ожидаемое значение.
общедоступный long декремент AndGet (int i)
Атомно уменьшает на единицу элемент с индексом i.
публично долго добираться (int i)
Получает текущее значение в позиции i.
public long getAndAdd (int i, long delta)
Атомно добавляет данное значение к элементу по индексу i.
public long getAndDecrement (int i)
Атомно уменьшает на единицу элемент с индексом i.
public long getAndIncrement (int i)
Атомно увеличивает на единицу элемент с индексом i.
public long getAndSet (int i, long newValue)
Атомно устанавливает элемент в позиции i на заданное значение и возвращает старое значение.
public long incrementAndGet (int i)
Атомно увеличивает на единицу элемент с индексом i.
public void lazySet (int i, long newValue)
В конце концов устанавливает элемент в позиции i на заданное значение.
public int length ()
Возвращает длину массива.
открытый набор void (int i, long newValue)
Устанавливает элемент в позиции i в указанное значение.
public String toString ()
Возвращает строковое представление текущих значений массива.
public boolean weakCompareAndSet (int i, long ожидают, long update)
Атомно устанавливает элемент в позиции i на заданное обновленное значение, если текущее значение == ожидаемое значение.
пример
Следующая программа TestThread показывает использование переменной AtomicIntegerArray в среде, основанной на потоках.
import java.util.concurrent.atomic.AtomicLongArray; public class TestThread { private static AtomicLongArray atomicLongArray = new AtomicLongArray(10); public static void main(final String[] arguments) throws InterruptedException { for (int i = 0; i<atomicLongArray.length(); i++) { atomicLongArray.set(i, 1); } Thread t1 = new Thread(new Increment()); Thread t2 = new Thread(new Compare()); t1.start(); t2.start(); t1.join(); t2.join(); System.out.println("Values: "); for (int i = 0; i<atomicLongArray.length(); i++) { System.out.print(atomicLongArray.get(i) + " "); } } static class Increment implements Runnable { public void run() { for(int i = 0; i<atomicLongArray.length(); i++) { long add = atomicLongArray.incrementAndGet(i); System.out.println("Thread " + Thread.currentThread().getId() + ", index " +i + ", value: "+ add); } } } static class Compare implements Runnable { public void run() { for(int i = 0; i<atomicLongArray.length(); i++) { boolean swapped = atomicLongArray.compareAndSet(i, 2, 3); if(swapped) { System.out.println("Thread " + Thread.currentThread().getId() + ", index " +i + ", value: 3"); } } } } }
Это даст следующий результат.