Concorrenza Java - AtomicReference Class
Una classe java.util.concurrent.atomic.AtomicReference fornisce operazioni sul riferimento all'oggetto sottostante che possono essere lette e scritte in modo atomico e contiene anche operazioni atomiche avanzate. AtomicReference supporta operazioni atomiche sulla variabile di riferimento dell'oggetto sottostante. Ha metodi get e set che funzionano come letture e scritture su variabili volatili. Cioè, un insieme ha una relazione accade prima con qualsiasi successivo get sulla stessa variabile. Anche il metodo compareAndSet atomico ha queste caratteristiche di coerenza della memoria.
Metodi AtomicReference
Di seguito è riportato l'elenco dei metodi importanti disponibili nella classe AtomicReference.
Sr.No. | Metodo e descrizione |
---|---|
1 | public boolean compareAndSet(V expect, V update) Atomicamente imposta il valore sul valore aggiornato dato se il valore corrente == il valore atteso. |
2 | public boolean get() Restituisce il valore corrente. |
3 | public boolean getAndSet(V newValue) Atomicamente imposta il valore dato e restituisce il valore precedente. |
4 | public void lazySet(V newValue) Alla fine si imposta sul valore dato. |
5 | public void set(V newValue) Imposta incondizionatamente al valore dato. |
6 | public String toString() Restituisce la rappresentazione String del valore corrente. |
7 | public boolean weakCompareAndSet(V expect, V update) Atomicamente imposta il valore sul valore aggiornato dato se il valore corrente == il valore atteso. |
Esempio
Il seguente programma TestThread mostra l'utilizzo della variabile AtomicReference in un ambiente basato su thread.
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());
}
}
Questo produrrà il seguente risultato.
Produzione
Message is: hello
Atomic Reference of Message is: Thread 1