Concorrenza Java - AtomicBoolean Class

Una classe java.util.concurrent.atomic.AtomicBoolean fornisce operazioni sul valore booleano sottostante che può essere letto e scritto in modo atomico e contiene anche operazioni atomiche avanzate. AtomicBoolean supporta operazioni atomiche sulla variabile booleana 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 AtomicBoolean

Di seguito è riportato l'elenco dei metodi importanti disponibili nella classe AtomicBoolean.

Sr.No. Metodo e descrizione
1

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

Atomicamente imposta il valore dato e restituisce il valore precedente.

4

public void lazySet(boolean newValue)

Alla fine si imposta sul valore dato.

5

public void set(boolean newValue)

Imposta incondizionatamente al valore dato.

6

public String toString()

Restituisce la rappresentazione String del valore corrente.

7

public boolean weakCompareAndSet(boolean expect, boolean 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 AtomicBoolean in un ambiente basato su thread.

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

Questo produrrà il seguente risultato.

Produzione

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!