Concurrencia de Java - Clase AtomicBoolean

Una clase java.util.concurrent.atomic.AtomicBoolean proporciona operaciones sobre un valor booleano subyacente que se puede leer y escribir de forma atómica, y también contiene operaciones atómicas avanzadas. AtomicBoolean admite operaciones atómicas en una variable booleana 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 AtomicBooleanos

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

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

public boolean compareAndSet(boolean expect, boolean 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(boolean newValue)

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

4

public void lazySet(boolean newValue)

Eventualmente se establece en el valor dado.

5

public void set(boolean newValue)

Establece incondicionalmente al valor dado.

6

public String toString()

Devuelve la representación de cadena del valor actual.

7

public boolean weakCompareAndSet(boolean expect, boolean 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 AtomicBoolean en un entorno basado en subprocesos.

import java.util.concurrent.atomic.AtomicBoolean;

public class TestThread {

   public static void main(final String[] arguments) throws InterruptedException {
      final AtomicBoolean atomicBoolean = new AtomicBoolean(false);

      new Thread("Thread 1") {

         public void run() {

            while(true) {
               System.out.println(Thread.currentThread().getName() 
                  +" Waiting for Thread 2 to set Atomic variable to true. Current value is "
                  + atomicBoolean.get());

               if(atomicBoolean.compareAndSet(true, false)) {
                  System.out.println("Done!");
                  break;
               }
            }
         };
      }.start();

      new Thread("Thread 2") {

         public void run() {
            System.out.println(Thread.currentThread().getName() +
               ", Atomic Variable: " +atomicBoolean.get()); 
            System.out.println(Thread.currentThread().getName() +
               " is setting the variable to true ");
            atomicBoolean.set(true);
            System.out.println(Thread.currentThread().getName() +
               ", Atomic Variable: " +atomicBoolean.get()); 
         };
      }.start();
   }
}

Esto producirá el siguiente resultado.

Salida

Thread 1 Waiting for Thread 2 to set Atomic variable to true. Current value is false
Thread 1 Waiting for Thread 2 to set Atomic variable to true. Current value is false
Thread 1 Waiting for Thread 2 to set Atomic variable to true. Current value is false
Thread 2, Atomic Variable: false
Thread 1 Waiting for Thread 2 to set Atomic variable to true. Current value is false
Thread 2 is setting the variable to true
Thread 2, Atomic Variable: true
Thread 1 Waiting for Thread 2 to set Atomic variable to true. Current value is false
Done!