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