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