Współbieżność Java - klasa AtomicLongArray
Klasa java.util.concurrent.atomic.AtomicLongArray zapewnia operacje na bazowej długiej tablicy, które mogą być odczytywane i zapisywane atomowo, a także zawiera zaawansowane operacje atomowe. AtomicLongArray obsługuje niepodzielne operacje na bazowej zmiennej tablicy. Posiada metody pobierania i ustawiania, które działają jak odczyty i zapisy na zmiennych nietrwałych. Oznacza to, że zestaw ma relację zdarzenie przed każdym kolejnym uzyskaniem tej samej zmiennej. Atomowa metoda compareAndSet również ma te funkcje spójności pamięci.
Metody AtomicLongArray
Poniżej znajduje się lista ważnych metod dostępnych w klasie AtomicLongArray.
Sr.No. | Metoda i opis |
---|---|
1 | public long addAndGet(int i, long delta) Atomowo dodaje podaną wartość do elementu o indeksie i. |
2 | public boolean compareAndSet(int i, long expect, long update) Atomowo ustawia element na pozycji i na podaną zaktualizowaną wartość, jeśli bieżąca wartość == oczekiwana wartość. |
3 | public long decrementAndGet(int i) Atomowo zmniejsza o jeden element pod indeksem i. |
4 | public long get(int i) Pobiera bieżącą wartość z pozycji i. |
5 | public long getAndAdd(int i, long delta) Atomowo dodaje podaną wartość do elementu o indeksie i. |
6 | public long getAndDecrement(int i) Atomowo zmniejsza o jeden element pod indeksem i. |
7 | public long getAndIncrement(int i) Atomowo zwiększa o jeden element pod indeksem i. |
8 | public long getAndSet(int i, long newValue) Atomowo ustawia element w pozycji i na podaną wartość i zwraca starą wartość. |
9 | public long incrementAndGet(int i) Atomowo zwiększa o jeden element pod indeksem i. |
10 | public void lazySet(int i, long newValue) Ostatecznie ustawia element w pozycji i na podaną wartość. |
11 | public int length() Zwraca długość tablicy. |
12 | public void set(int i, long newValue) Ustawia element w pozycji i na podaną wartość. |
13 | public String toString() Zwraca ciąg znaków reprezentujący bieżące wartości tablicy. |
14 | public boolean weakCompareAndSet(int i, long expect, long update) Atomowo ustawia element na pozycji i na podaną zaktualizowaną wartość, jeśli bieżąca wartość == oczekiwana wartość. |
Przykład
Poniższy program TestThread przedstawia użycie zmiennej AtomicIntegerArray w środowisku opartym na wątkach.
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");
}
}
}
}
}
Spowoduje to następujący wynik.
Wynik
Thread 9, index 0, value: 2
Thread 10, index 0, value: 3
Thread 9, index 1, value: 2
Thread 9, index 2, value: 2
Thread 9, index 3, value: 2
Thread 9, index 4, value: 2
Thread 10, index 1, value: 3
Thread 9, index 5, value: 2
Thread 10, index 2, value: 3
Thread 9, index 6, value: 2
Thread 10, index 3, value: 3
Thread 9, index 7, value: 2
Thread 10, index 4, value: 3
Thread 9, index 8, value: 2
Thread 9, index 9, value: 2
Thread 10, index 5, value: 3
Thread 10, index 6, value: 3
Thread 10, index 7, value: 3
Thread 10, index 8, value: 3
Thread 10, index 9, value: 3
Values:
3 3 3 3 3 3 3 3 3 3