Java Concurrency - AtomicReference-Klasse
Eine java.util.concurrent.atomic.AtomicReference-Klasse bietet Operationen für zugrunde liegende Objektreferenzen, die atomar gelesen und geschrieben werden können, und enthält auch erweiterte atomare Operationen. AtomicReference unterstützt atomare Operationen für die zugrunde liegende Objektreferenzvariable. Es verfügt über Methoden zum Abrufen und Festlegen, die wie das Lesen und Schreiben flüchtiger Variablen funktionieren. Das heißt, eine Menge hat eine Vorher-Beziehung zu einem nachfolgenden Abruf derselben Variablen. Die atomare compareAndSet-Methode verfügt auch über diese Speicherkonsistenzfunktionen.
AtomicReference-Methoden
Im Folgenden finden Sie eine Liste wichtiger Methoden, die in der AtomicReference-Klasse verfügbar sind.
Sr.Nr. | Methode & Beschreibung |
---|---|
1 | public boolean compareAndSet(V expect, V update) Setzt den Wert atomar auf den angegebenen aktualisierten Wert, wenn der aktuelle Wert == der erwartete Wert ist. |
2 | public boolean get() Gibt den aktuellen Wert zurück. |
3 | public boolean getAndSet(V newValue) Setzt atomar auf den angegebenen Wert und gibt den vorherigen Wert zurück. |
4 | public void lazySet(V newValue) Setzt schließlich auf den angegebenen Wert. |
5 | public void set(V newValue) Wird unbedingt auf den angegebenen Wert gesetzt. |
6 | public String toString() Gibt die String-Darstellung des aktuellen Werts zurück. |
7 | public boolean weakCompareAndSet(V expect, V update) Setzt den Wert atomar auf den angegebenen aktualisierten Wert, wenn der aktuelle Wert == der erwartete Wert ist. |
Beispiel
Das folgende TestThread-Programm zeigt die Verwendung der AtomicReference-Variablen in einer threadbasierten Umgebung.
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());
}
}
Dies führt zu folgendem Ergebnis.
Ausgabe
Message is: hello
Atomic Reference of Message is: Thread 1