Java Eşzamanlılığı - AtomicBoolean Sınıfı

Bir java.util.concurrent.atomic.AtomicBoolean sınıfı, atomik olarak okunabilen ve yazılabilen temel boole değeri üzerinde işlemler sağlar ve ayrıca gelişmiş atomik işlemleri içerir. AtomicBoolean, temel boolean değişkeni üzerinde atomik işlemleri destekler. Uçucu değişkenler üzerinde okuma ve yazma gibi çalışan alma ve ayarlama yöntemlerine sahiptir. Diğer bir deyişle, bir küme aynı değişken üzerindeki sonraki herhangi bir get ile önceden-olur ilişkisine sahiptir. Atomic CompareAndSet yöntemi de bu bellek tutarlılığı özelliklerine sahiptir.

AtomicBoolean Yöntemleri

Aşağıda, AtomicBoolean sınıfında bulunan önemli yöntemlerin listesi verilmiştir.

Sr.No. Yöntem ve Açıklama
1

public boolean compareAndSet(boolean expect, boolean update)

Geçerli değer == beklenen değer ise, değeri atomik olarak verilen güncellenmiş değere ayarlar.

2

public boolean get()

Mevcut değeri döndürür.

3

public boolean getAndSet(boolean newValue)

Atomik olarak verilen değere ayarlanır ve önceki değeri döndürür.

4

public void lazySet(boolean newValue)

Sonunda verilen değere ayarlar.

5

public void set(boolean newValue)

Koşulsuz olarak verilen değere ayarlar.

6

public String toString()

Geçerli değerin String temsilini döndürür.

7

public boolean weakCompareAndSet(boolean expect, boolean update)

Geçerli değer == beklenen değer ise, değeri atomik olarak verilen güncellenmiş değere ayarlar.

Misal

Aşağıdaki TestThread programı AtomicBoolean değişkeninin thread tabanlı ortamda kullanımını göstermektedir.

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

Bu, aşağıdaki sonucu verecektir.

Çıktı

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!