Simultaneidade Java - classe AtomicReference

Uma classe java.util.concurrent.atomic.AtomicReference fornece operações na referência de objeto subjacente que podem ser lidas e gravadas atomicamente e também contém operações atômicas avançadas. AtomicReference oferece suporte a operações atômicas na variável de referência de objeto subjacente. Ele possui métodos get e set que funcionam como leituras e gravações em variáveis ​​voláteis. Ou seja, um conjunto tem um relacionamento acontece antes com qualquer obtenção subsequente na mesma variável. O método atômico compareAndSet também possui esses recursos de consistência de memória.

Métodos AtomicReference

A seguir está a lista de métodos importantes disponíveis na classe AtomicReference.

Sr. Não. Método e Descrição
1

public boolean compareAndSet(V expect, V update)

Define atomicamente o valor para o valor atualizado fornecido se o valor atual == o valor esperado.

2

public boolean get()

Retorna o valor atual.

3

public boolean getAndSet(V newValue)

Define atomicamente o valor fornecido e retorna o valor anterior.

4

public void lazySet(V newValue)

Eventualmente define o valor fornecido.

5

public void set(V newValue)

Define incondicionalmente o valor fornecido.

6

public String toString()

Retorna a representação de String do valor atual.

7

public boolean weakCompareAndSet(V expect, V update)

Define atomicamente o valor para o valor atualizado fornecido se o valor atual == o valor esperado.

Exemplo

O seguinte programa TestThread mostra o uso da variável AtomicReference em ambiente baseado em encadeamento.

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

Isso produzirá o seguinte resultado.

Resultado

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