AtomicReferenceArray Sınıfı

Bir java.util.concurrent.atomic.AtomicReferenceArray sınıfı, atomik olarak okunabilen ve yazılabilen temel referans dizisi üzerinde işlemler sağlar ve ayrıca gelişmiş atomik işlemleri içerir. AtomicReferenceArray, temel alınan referans dizi 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-olan ilişkisine sahiptir. Atomic CompareAndSet yöntemi de bu bellek tutarlılığı özelliklerine sahiptir.

AtomicReferenceArray Yöntemleri

AtomicReferenceArray sınıfında bulunan önemli yöntemlerin listesi aşağıdadır.

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

public boolean compareAndSet(int i, E expect, E update)

Mevcut değer == beklenen değer ise, i konumundaki öğeyi atomik olarak verilen güncellenmiş değere ayarlar.

2

public E get(int i)

İ konumundaki mevcut değeri alır.

3

public E getAndSet(int i, E newValue)

İ konumundaki öğeyi atomik olarak verilen değere ayarlar ve eski değeri döndürür.

4

public void lazySet(int i, E newValue)

Sonunda i konumundaki öğeyi verilen değere ayarlar.

5

public int length()

Dizinin uzunluğunu döndürür.

6

public void set(int i, E newValue)

İ konumundaki öğeyi verilen değere ayarlar.

7

public String toString()

Dizinin geçerli değerlerinin String temsilini döndürür.

8

public boolean weakCompareAndSet(int i, E expect, E update)

Mevcut değer == beklenen değer ise, i konumundaki öğeyi atomik olarak verilen güncellenmiş değere ayarlar.

Misal

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

import java.util.concurrent.atomic.AtomicReferenceArray;

public class TestThread {
   private static String[] source = new String[10];
   private static AtomicReferenceArray<String> atomicReferenceArray 
      = new AtomicReferenceArray<String>(source);

   public static void main(final String[] arguments) throws InterruptedException {

      for (int i = 0; i<atomicReferenceArray.length(); i++) {
         atomicReferenceArray.set(i, "item-2");
      }

      Thread t1 = new Thread(new Increment());
      Thread t2 = new Thread(new Compare());
      t1.start();
      t2.start();

      t1.join();
      t2.join();		
   }  

   static class Increment implements Runnable {
      
      public void run() {
         
         for(int i = 0; i<atomicReferenceArray.length(); i++) {
            String add = atomicReferenceArray.getAndSet(i,"item-"+ (i+1));
            System.out.println("Thread " + Thread.currentThread().getId() 
               + ", index " +i + ", value: "+ add);
         }
      }
   }

   static class Compare implements Runnable {
      
      public void run() {
         
         for(int i = 0; i<atomicReferenceArray.length(); i++) {
            System.out.println("Thread " + Thread.currentThread().getId() 
               + ", index " +i + ", value: "+ atomicReferenceArray.get(i));
            boolean swapped = atomicReferenceArray.compareAndSet(i, "item-2", "updated-item-2");
            System.out.println("Item swapped: " + swapped);
            
            if(swapped) {
               System.out.println("Thread " + Thread.currentThread().getId() 
                  + ", index " +i + ", updated-item-2");
            }
         }
      }
   }
}

Bu, aşağıdaki sonucu verecektir.

Çıktı

Thread 9, index 0, value: item-2
Thread 10, index 0, value: item-1
Item swapped: false
Thread 10, index 1, value: item-2
Item swapped: true
Thread 9, index 1, value: updated-item-2
Thread 10, index 1, updated-item-2
Thread 10, index 2, value: item-3
Item swapped: false
Thread 10, index 3, value: item-2
Item swapped: true
Thread 10, index 3, updated-item-2
Thread 10, index 4, value: item-2
Item swapped: true
Thread 10, index 4, updated-item-2
Thread 10, index 5, value: item-2
Item swapped: true
Thread 10, index 5, updated-item-2
Thread 10, index 6, value: item-2
Thread 9, index 2, value: item-2
Item swapped: true
Thread 9, index 3, value: updated-item-2
Thread 10, index 6, updated-item-2
Thread 10, index 7, value: item-2
Thread 9, index 4, value: updated-item-2
Item swapped: true
Thread 9, index 5, value: updated-item-2
Thread 10, index 7, updated-item-2
Thread 9, index 6, value: updated-item-2
Thread 10, index 8, value: item-2
Thread 9, index 7, value: updated-item-2
Item swapped: true
Thread 9, index 8, value: updated-item-2
Thread 10, index 8, updated-item-2
Thread 9, index 9, value: item-2
Thread 10, index 9, value: item-10
Item swapped: false