Concurrencia de Java - Clase AtomicReference

Una clase java.util.concurrent.atomic.AtomicReference proporciona operaciones en una referencia de objeto subyacente que se puede leer y escribir de forma atómica, y también contiene operaciones atómicas avanzadas. AtomicReference admite operaciones atómicas en la variable de referencia de objeto subyacente. Tiene métodos get y set que funcionan como lectura y escritura en variables volátiles. Es decir, un conjunto tiene una relación de suceder antes con cualquier obtención posterior de la misma variable. El método atomic compareAndSet también tiene estas características de coherencia de memoria.

Métodos de referencia atómica

A continuación se muestra la lista de métodos importantes disponibles en la clase AtomicReference.

No Señor. Método y descripción
1

public boolean compareAndSet(V expect, V update)

Atómicamente establece el valor en el valor actualizado dado si el valor actual == el valor esperado.

2

public boolean get()

Devuelve el valor actual.

3

public boolean getAndSet(V newValue)

Atómicamente se establece en el valor dado y devuelve el valor anterior.

4

public void lazySet(V newValue)

Eventualmente se establece en el valor dado.

5

public void set(V newValue)

Establece incondicionalmente al valor dado.

6

public String toString()

Devuelve la representación de cadena del valor actual.

7

public boolean weakCompareAndSet(V expect, V update)

Atómicamente establece el valor en el valor actualizado dado si el valor actual == el valor esperado.

Ejemplo

El siguiente programa TestThread muestra el uso de la variable AtomicReference en un entorno basado en subprocesos.

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());
   }
}

Esto producirá el siguiente resultado.

Salida

Message is: hello
Atomic Reference of Message is: Thread 1