Współbieżność Java - Klasa AtomicReference
Klasa java.util.concurrent.atomic.AtomicReference udostępnia operacje na bazowym odwołaniu do obiektu, które mogą być odczytywane i zapisywane atomowo, a także zawiera zaawansowane operacje atomowe. AtomicReference obsługuje niepodzielne operacje na bazowej zmiennej odwołania do obiektu. 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 AtomicReference
Poniżej znajduje się lista ważnych metod dostępnych w klasie AtomicReference.
Sr.No. | Metoda i opis |
---|---|
1 | public boolean compareAndSet(V expect, V update) Atomowo ustawia wartość na podaną zaktualizowaną wartość, jeśli bieżąca wartość == oczekiwana wartość. |
2 | public boolean get() Zwraca bieżącą wartość. |
3 | public boolean getAndSet(V newValue) Atomowo ustawia podaną wartość i zwraca poprzednią wartość. |
4 | public void lazySet(V newValue) Ostatecznie ustawia się na podaną wartość. |
5 | public void set(V newValue) Bezwarunkowo ustawia podaną wartość. |
6 | public String toString() Zwraca ciąg znaków reprezentujący bieżącą wartość. |
7 | public boolean weakCompareAndSet(V expect, V update) Atomowo ustawia wartość na podaną zaktualizowaną wartość, jeśli bieżąca wartość == oczekiwana wartość. |
Przykład
Poniższy program TestThread przedstawia użycie zmiennej AtomicReference w środowisku opartym na wątkach.
import java.util.concurrent.atomic.AtomicReference;
public class TestThread {
private static String message = "hello";
private static AtomicReference<String> atomicReference;
public static void main(final String[] arguments) throws InterruptedException {
atomicReference = new AtomicReference<String>(message);
new Thread("Thread 1") {
public void run() {
atomicReference.compareAndSet(message, "Thread 1");
message = message.concat("-Thread 1!");
};
}.start();
System.out.println("Message is: " + message);
System.out.println("Atomic Reference of Message is: " + atomicReference.get());
}
}
Spowoduje to następujący wynik.
Wynik
Message is: hello
Atomic Reference of Message is: Thread 1